有没有办法使用 Wagtail 片段来显示现有的 Django 模型?
Is there a way to use Wagtail Snippets to display existing Django Models?
使用 Wagtail CMS,模仿 Django CMS "Plugin" 功能的最佳方法是什么?
在 Django CMS 中,我能够编写一个 custom plugin 来显示模板和该模型的任何相关信息。然后内容管理员可以将该插件添加到站点上任何位置的占位符。
对于 Wagtail,我能找到的最接近的是 Snippet,但每次使用代码段时,您都必须将其专门包含在页面模型中。
以这两款机型为例:
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 有更好的方法吗?
要在不定义模型的情况下实现这种解决方案,您可以查看 StreamField 方法。
您可以定义一个自定义的 StreamField 块类型,它模拟 pets
或 books
。在需要它的页面上提供它,但您仍然必须明确哪些页面可以使用这个 StreamField。
然后您可以定义一个自定义模板来呈现这些项目,可在文档中找到:
http://docs.wagtail.io/en/v1.12.1/topics/streamfield.html#template-rendering
要使用通用定义模板实现这种解决方案,您可以在 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 }}
。
使用 Wagtail CMS,模仿 Django CMS "Plugin" 功能的最佳方法是什么?
在 Django CMS 中,我能够编写一个 custom plugin 来显示模板和该模型的任何相关信息。然后内容管理员可以将该插件添加到站点上任何位置的占位符。
对于 Wagtail,我能找到的最接近的是 Snippet,但每次使用代码段时,您都必须将其专门包含在页面模型中。
以这两款机型为例:
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 有更好的方法吗?
要在不定义模型的情况下实现这种解决方案,您可以查看 StreamField 方法。
您可以定义一个自定义的 StreamField 块类型,它模拟 pets
或 books
。在需要它的页面上提供它,但您仍然必须明确哪些页面可以使用这个 StreamField。
然后您可以定义一个自定义模板来呈现这些项目,可在文档中找到:
http://docs.wagtail.io/en/v1.12.1/topics/streamfield.html#template-rendering
要使用通用定义模板实现这种解决方案,您可以在 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 }}
。