Wagtail:如何在片段选择器对话框的「创建」标签页显示面板
解决Wagtail片段选择器创建表单与后台创建页面表单一致的问题
要让片段选择器的「创建」标签页表单和后台完整创建页面的面板渲染效果一致,需要自定义选择器的创建视图,替换默认的普通模型表单为基于Wagtail面板的表单,并调整模板渲染逻辑,具体步骤如下:
1. 自定义选择器创建视图
继承Wagtail的SnippetChooserCreateView,重写get_form_class方法,返回基于片段面板定义的WagtailAdminModelForm(这是Wagtail后台表单默认使用的类,支持面板渲染)。
from wagtail.snippets.views.chooser import SnippetChooserCreateView from wagtail.admin.forms import WagtailAdminModelForm class MySnippetChooserCreateView(SnippetChooserCreateView): def get_form_class(self): # 基于当前片段模型和其面板定义创建表单类 class SnippetChooserPanelForm(WagtailAdminModelForm): class Meta: model = self.model fields = "__all__" # 关联片段的panels作为表单的编辑处理器 edit_handler = self.model.panels return SnippetChooserPanelForm
2. 配置片段选择器视图集
在自定义的SnippetChooserViewSet中,指定create_view_class为上面定义的自定义视图,同时保留exclude_fields = []以显示创建标签页:
from wagtail.snippets.views.chooser import SnippetChooserViewSet from .models import MySnippet class MySnippetChooserViewSet(SnippetChooserViewSet): model = MySnippet exclude_fields = [] # 替换默认的创建视图 create_view_class = MySnippetChooserCreateView # 指定使用支持面板渲染的模板 create_template_name = "wagtailadmin/snippets/chooser/create_with_panels.html"
3. 自定义创建模板
创建create_with_panels.html模板,使用Wagtail的面板渲染逻辑替代普通表单渲染:
{% extends "wagtailadmin/chooser/create.html" %} {% load wagtailadmin_tags %} {% block form %} {% include "wagtailadmin/shared/form_as_panels.html" with form=form %} {% endblock %}
这个模板继承了选择器的默认创建模板,替换了表单渲染部分,使用form_as_panels.html来渲染基于面板的表单,和后台完整创建页面的渲染逻辑一致。
4. 注册选择器视图集
最后在wagtail_hooks.py中注册自定义的选择器视图集:
from wagtail import hooks from .views import MySnippetChooserViewSet @hooks.register("register_admin_viewset") def register_my_snippet_chooser_viewset(): return MySnippetChooserViewSet("my_snippet_chooser", url_prefix="my-snippet-chooser")
这样配置后,片段选择器的「创建」标签页就会使用和后台完整创建页面完全一致的面板布局来渲染表单了。
内容的提问来源于stack exchange,提问作者tbrlpld
相关产品推荐
相关产品推荐

