2016-05-11 4 views
0

私はCMS page extensionジャンゴを持っている:ジャンゴCMSページの拡張データの重複

class MyAppExtension(PageExtension): 
    show_in_catalog = models.BooleanField() 
    filters_to_show = models.ManyToManyField(Attribute) 

extension_pool.register(MyAppExtension) 

再生回数:

class MyListView(FilterView): 
    ..... 

    def get_filterset_kwargs(self, filterset_class): 
     extension = MyAppExtension.objects.get(
           extended_object=self.request.current_page) 
     attributes = extension.filters_to_show.all() 

を今すぐすべてのページに、私は、属性のリストを取得する必要があります。しかし、ライブでは、モードで空リストを取得します。 ドラフトモードに切り替えると、期待通りに属性リストが取得されます。

ちょっと混乱した後、私はMyAppExtension.objects.all()がページごとに複製されていて、いずれの場合も空のfilters_to_showリストが重複していることを発見しました。私はそれが私が呼ぶときは異なるpkを持ってMyAppExtension.objects.get(extended_object=self.request.current_page)呼び出すライブモードでも

、その ドラフトモードインチだから私の質問:

  • 何が起こっているか
  • どのようにして正しいオブジェクトを取得できますかライブモード?
  • すべての内線番号に重複があるのはなぜですか?

live to draft

答えて

1

cms.Pageオブジェクトは、公開されたドラフトの形で存在し、(それに関連するすべてのオブジェクトと共に)案は、発行操作中の他のバージョンにコピーされます。

お客様のMyAppExtension.objectsにはManyToManyField属性があります。これらもコピーする必要があります。そうしないと、公開されたバージョンは、あなたが発見したように、これらのオブジェクトに戻ることができなくなります。

Handling relationsのページ拡張のドキュメントには、対処方法が説明されています。例を挙げれば、ページ拡張にcopy_relations()メソッドを追加して新しいインスタンスにコピーします。

この方法を使用しないと、ページ上のすべてのコピー操作が、パブリッシュだけでなく、オブジェクトのコピーに失敗することがわかります。

+0

ええ、コピーの関係で解決しましたが、cms docsのコードが私の場合には正しくないことに注意してください。モデルクラスでは、私は 'copy copy_relations(self、oldinstance、language): self.filters_to_show = oldinstance.filters_to_show.all()'と書きました。 –

+0

フィードバックをいただき、ありがとうございます。私はドキュメントを見ていきます。 –

関連する問題