注册片段
可以使用 register_snippet 作为装饰器或函数来注册 snippet。建议使用后者,但提供装饰器是为了方便和向后兼容。
使用 @register_snippet 作为装饰器
在 Django 模型中,可以使用 @register_snippet 装饰器注册片段。下面是一个示例片段模型:
from django.db import models
from wagtail.admin.panels import FieldPanel
from wagtail.snippets.models import register_snippet
# ...
@register_snippet
class Advert(models.Model):
url = models.URLField(null=True, blank=True)
text = models.CharField(max_length=255)
panels = [
FieldPanel("url"),
FieldPanel("text"),
]
def __str__(self):
return self.text
Advert 模型使用基本的 Django 模型类,并定义了两个属性: url 和 text。编辑界面与页面派生模型提供的界面非常相似,在 panels ( 或 edit_handler )属性中分配字段。除非进一步配置,否则代码片段不使用多个字段选项卡,也不提供“另存为草案”或“提交审核”功能。
@register_snippet 告诉 Wagtail 将模型视为片段。面板列表定义了要在片段编辑页面上显示的字段。使用 def __str__(self) 提供类的字符串输出也很重要:这样在 Wagtail 管理中列出的片段对象才有意义。
使用 register_snippet 作为函数
虽然 @register_snippet 装饰器很方便,但推荐注册片段的方法是在 wagtail_hooks.py 文件中将 register_snippet 作为函数使用。示例:
# myapp/wagtail_hooks.py
from wagtail.snippets.models import register_snippet
from myapp.models import Advert
register_snippet(Advert)
以这种方式注册片段允许您稍后使用自定义 [SnippetViewSet] 类进一步自定义。这也为 Django 模型和 Wagtail 特定的关注点提供了更好的分离。例如,与其在模型类中定义 panels 或 edit_handler,不如在 SnippetViewSet 类中定义它们:
# myapp/wagtail_hooks.py
from wagtail.snippets.models import register_snippet
from wagtail.snippets.views.snippets import SnippetViewSet
from myapp.models import Advert
class AdvertViewSet(SnippetViewSet):
model = Advert
panels = [
FieldPanel("url"),
FieldPanel("text"),
]
# Instead of using @register_snippet as a decorator on the model class,
# register the snippet using register_snippet as a function and pass in
# the custom SnippetViewSet subclass.
register_snippet(AdvertViewSet)
如果您想对面板进行更多的定制,您可以覆盖 get_edit_handler()方法。进一步的自定义将在稍后的自定义片段的管理视图中解释。