J'essaie de faire une copie d'une arborescence de pages FeinCMS, qui est gérée en utilisant django-mptt. J'ai écrit cette fonction:Faire une copie d'une arborescence de pages FeinCMS en utilisant django-mptt modifie l'ordre des fils
def make_tree_copy(page, parent=None):
'''
Makes a copy of the tree starting at "page", reparenting it to "parent"
'''
new_page = Page.objects.create_copy(page)
new_page.save()
Page.tree.move_node(new_page, parent)
# re-read so django-mptt fields get updated
new_page = Page.objects.get(id=new_page.id)
for child in page.get_children():
# re-read so django-mptt fields get updated
child = Page.objects.get(id=child.id)
make_tree_copy(child, new_page)
et l'appeler à l'aide
make_tree_copy(Page.tree.root_nodes()[0])
Il fonctionne en général, mais quand j'ai un arbre de la page qui ressemble à ceci:
A
|- B
|- C
|- D
Il vient comme cela :
A
|- B
|- D
|- C
De ma st En passant par le code mptt, la magie semble se produire dans mptt/managers.py/_inter_tree_move_and_close_gap(), où, pour une raison quelconque, les valeurs "lft" des petits-enfants sont modifiées. Avant le coup, ils sont C = 3, D = 5, après ils sont C = 5, D = 3.
Ce qui explique pourquoi D est trié avant C mais je ne sais pas pourquoi ces valeurs sont commutées. Des pensées?
récentes versions django-MPTT sont un peu plus intelligent en matière de mise à jour des propriétés MPTT sur les instances de modèle (LFT, rght, niveau, etc.); peut-être qu'ils travaillent sans recharger des modèles encore et encore, je ne l'ai pas encore testé trop, cependant. –