2017-09-02 58 views
0

使用W CMS CMS,模仿Django CMS的「插件」功能的最佳方式是什麼?有沒有辦法使用Wagtail Snippets來顯示現有的Django模型?

在Django CMS中,我可以編寫一個custom plugin,它可以向模型顯示模板和任何相關信息。內容管理員然後可以將該插件添加到站點上的任何位置的佔位符。

對於W,,我能找到的最接近的是Snippet,但是每次使用代碼片段時,都必須將其專門包含在Page模型中。

拿這兩款機型,例如:

class Pet(models.Model): 
    species = models.CharField(max_length=10) 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.CharField(max_length=100) 

對於內容管理器能夠訪問這些我需要將它們註冊爲片斷,然後列出該頁面的模型中的每個模型,如下所示:

class HomePage(Page): 
    content_panels = Page.content_panels + [ 
     SnippetChooserPanel('pet'), 
     SnippetChooserPanel('book'), 
    ] 

有沒有更好的方法來做到這一點與W??

回答

1

要實現這種解決方案而不需要定義模型,您可以查看StreamField方法。

您可以定義模型爲petsbooks的自定義StreamField塊類型。在需要此頁面的頁面上可用,但仍需明確哪些頁面可以使用此StreamField。

然後,您可以定義呈現這些項目自定義模板,文檔中提供:

http://docs.wagtail.io/en/v1.12.1/topics/streamfield.html#template-rendering

+0

將此標記爲正確答案。證實了我的假設,即片段必須被明確聲明。謝謝。 –

0

爲了實現這樣的一個通用的定義的模板解決方案,您可以定義在Book了一種方法和Pets類。

喜歡的東西:

from django.template.loader import render_to_string 
from django.utils.safestring import mark_safe 


class Book(models.Model): 
    title = models.CharField(max_length=100) 
    author = models.CharField(max_length=100) 
    template = 'path/to/template.html' 

    get_as_html(self): 
     return mark_safe(render_to_string(self.template, {'self': self})) 

您將需要創建處理Book實例的模板文件。這意味着您可以在任何使用Book代碼段的模板中輕鬆調用{{ Book.get_has_html }}

相關問題