【问题标题】:Is there a way to use Wagtail Snippets to display existing Django Models?有没有办法使用 Wagtail Snippets 来显示现有的 Django 模型?
【发布时间】:2017-09-02 23:57:22
【问题描述】:

使用 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)

为了让内容管理器能够访问这些,我需要将它们注册为 sn-ps,然后像这样列出该页面模型中的每个模型:

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

Wagtail 有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python django wagtail


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 将此标记为正确答案。确认我的假设 sn-ps 必须明确声明。谢谢。
    【解决方案2】:

    要使用通用定义的模板实现这种解决方案,您可以在 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 sn-p 的模板中轻松调用 {{ Book.get_has_html }}

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-20
      • 2021-09-11
      • 1970-01-01
      • 2021-01-23
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多