首页 > 文档 > Wagtail 5.2 LTS 中文文档 > 使用指导 > 片段 (Snippets) > 注册片段

注册片段

可以使用 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 模型类,并定义了两个属性: urltext。编辑界面与页面派生模型提供的界面非常相似,在 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 特定的关注点提供了更好的分离。例如,与其在模型类中定义 panelsedit_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()方法。进一步的自定义将在稍后的自定义片段的管理视图中解释。