2017-09-15 2 views
0

Je suis nouveau à la bergeronnette mais je continue à courir dans quelque chose que je suis sûr qu'il y a une meilleure solution pour ce que je fais actuellement.Transformer un objet Page en objet Dérivé de la page

Disons que j'ai une page Wagtail appelée ProductPage. Disons que cette page a un champ qui est une autre ProductPage appelée related_product. Lorsque je tente d'accéder à cette page dans mes modèles ou contexte par le code suivant,

self.related_product 

retourne un objet page au lieu d'un objet page produit. À cause de cela, je ne peux pas les champs que je veux vraiment sans le transformer en un objet par voie de page produit,

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

Il doit y avoir un moyen de transformer ce sans cette requête ci-dessus.

+0

Comment lier des pages correctement dans Wagtail est montré ici - https://godjango.com/search/?q=wagtail. Les tutoriels ne sont pas gratuits, mais assez bon marché, et l'inscription peut être annulée à tout moment. En disant cela, j'ai utilisé ses tutoriels depuis plus d'un an maintenant. – MagicLAMP

Répondre

1

La méthode standard pour passer d'un Page exemple au modèle plus spécifique est d'accéder à la specific propriété:

product_page = some_page.specific # returns a ProductPage instance 

Cependant, cela effectuer à l'interne une requête de base de données, il est donc pas plus efficace que votre code ci-dessus (juste plus lisible). Si vous avez un queryset de Page s, vous pouvez améliorer les choses un peu en appelant specific() sur le queryset, qui effectuera une requête supplémentaire pour chaque type de page qui existe dans le queryset:

product_pages = product_index.get_children().specific() 

Dans votre cas, si , il y a une bien meilleure solution: si le champ related_product ne sera jamais utilisé que pour lier un ProductPage et pas n'importe quel autre type de page, alors vous devriez l'indiquer dans le modèle de données en faisant pointer votre clé étrangère sur ProductPage, plutôt que Page :

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

Lorsque vous faites cela, l'accès some_page.related_product vous donnera toujours l'instance ProductPage. Comme un avantage supplémentaire, le popup de sélecteur de page dans l'admin de Wagtail s'assurera que vous pouvez seulement choisir ProductPages (et si toutes vos ProductPages sont au même endroit dans votre arbre de page, vous y mèneront directement).