2017-09-02 63 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 }}

相关问题