有没有办法使用Wagtail Snippets来显示现有的Django模型?

时间:2017-09-02 23:57:23

标签: python django wagtail

使用Wagtail CMS,模仿"插件"的最佳方式是什么? Django CMS的功能?

在Django CMS中,我能够编写一个custom plugin,可以向该模型显示模板和任何相关信息。然后,内容管理员可以将该插件添加到网站上任何位置的占位符。

使用Wagtail,我能找到的最接近的是Snippet,但每次使用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'),
    ]

使用Wagtail有更好的方法吗?

2 个答案:

答案 0 :(得分:2)

要在不定义模型的情况下实现此类解决方案,您可以查看StreamField方法。

您可以定义模拟petsbooks的自定义StreamField块类型。在需要此页面的页面上提供此功能,您仍然必须明确哪些页面可以使用此StreamField。

然后,您可以定义呈现这些项目的自定义模板,可在文档中找到:

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

答案 1 :(得分:0)

要使用通用定义模板实现此类解决方案,您可以在BookPets类上定义方法。

类似的东西:

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 }}