2017-09-15 58 views
0

我是新來鶺鴒,但我一直運行到,我肯定有比我目前在做什麼更好的解決辦法的東西。翻頁對象到其頁面派生類對象

可以說我有一個鶺鴒頁面調用ProductPage。可以說這個頁面有一個字段,它是另一個名爲related_product的ProductPage。當我嘗試通過以下代碼訪問我的模板或上下文中的該頁面時,

self.related_product 

它返回Page對象而不是ProductPage對象。正因爲如此,我不能給我居然要到田裏無由的方式把它變成一個ProductPage對象,

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

必須有沒有這個上面的查詢將這一方式。

+0

如何鶺鴒正確鏈接頁面顯示在這裏 - https://godjango.com/search/?q=wagtail。這些教程不是免費的,但相當便宜,並且可以隨時取消註冊。說,我已經使用了他的教程一年多了。 – MagicLAMP

回答

1

的標準方法從Page實例去更多的具體型號是訪問specific屬性:

product_page = some_page.specific # returns a ProductPage instance 

然而,這將在內部執行數據庫查詢,所以它不是任何更有效比你上面的代碼(更可讀)。如果你有Page個查詢集,你可以稍微通過在查詢集,這將對於存在於查詢集每個不同的頁面類型上執行一個額外的查詢調用specific()改善的事情:

product_pages = product_index.get_children().specific() 

在你的情況下,雖然,有一個更好的解決方案:如果related_product領域將只被用來鏈接到ProductPage,而不是任何其他類型的網頁,那麼你應該有你的外鍵點ProductPage表明這個數據模型,而不是Page

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

當你做到這一點,訪問some_page.related_product總會給你ProductPage實例。作爲一個額外的好處,在鶺鴒管理頁面選擇器彈出將確保你只能挑選ProductPages(如果你所有的ProductPages都在你的頁面樹一樣的地方,將帶你直接出現)。