2017-09-15 16 views
0

私はwagtailを初めて使っていますが、私が現在行っていることよりも良い解決策があると確信しています。Pageオブジェクトをそのページの派生オブジェクトにする

私はProductPageというWagtailページを持っていると言います。このページには、related_productという別のProductPageというフィールドがあります。

self.related_product 

これは、テンプレートまたはコンテキストでこのページにアクセスしようとすると、ProductPageオブジェクトではなくPageオブジェクトが返されます。このため、私は私が実際に

ProductPage.objects.get(page_ptr_id=self.related_product.id) 

の方法によりProductPageオブジェクトに変換しなくて、この上記のクエリせずにこれを変換するための方法がなければならないしたいフィールドに取得することはできません。それはどんな方が効率的ではありませんので、しかし

product_page = some_page.specific # returns a ProductPage instance 

が、これは内部データベースクエリを実行します。

+0

Wagtailでページを正しくリンクする方法は、https://godjango.com/search/?q=wagtailでご覧いただけます。チュートリアルは無料ではありませんが、かなり安いですし、登録はいつでもキャンセルできます。それでは、私は彼のチュートリアルを1年以上使っています。 – MagicLAMP

答えて

1

より具体的なモデルにPageインスタンスから行くための標準的な方法はspecificプロパティにアクセスすることです上記のコードよりも(読みやすい)しかし、あなたの場合は

product_pages = product_index.get_children().specific() 

:あなたはPage秒のクエリセットを持っている場合は、わずかクエリセットに存在する各異なるページタイプごとに1つの追加のクエリを実行しますクエリセット、上specific()を呼び出すことによって、物事を向上させることができますより良い解決策があります:related_productフィールドがProductPageにリンクするためにのみ使用され、他の種類のページには使用されない場合、Pageではなく、外部キーポイントをProductPageにすることによってデータモデルにこれを示す必要があります:

class ProductPage(Page): 
    # ... 
    related_product = models.ForeignKey('myapp.ProductPage', null=True, blank=True, on_delete=models.SET_NULL) 

これを行うと、some_page.related_productにアクセスすると、常にProductPageインスタンスが得られます。追加の利点として、Wagtailの管理者のページ・チューザー・ポップアップでは、ProductPagesのみを選択できることが保証されます(ProductPagesがすべてページ・ツリーの同じ場所にある場合は、直接そこに移動します)。

関連する問題