Wagtail:如何覆盖 PageModel 的 create/edit 模板

Wagtail: How to overwrite create/edit template for PageModel

我想覆盖 create.htmledit.html 用于派生自鹡鸰的模型 'PageModel'。

如果我对 docs 的理解正确,它应该像指定属性一样简单:

class MyAdmin(ModelAdmin):
    model = MyPage
    create_template_name = "myapp/create.html" 
    edit_template_name = "myapp/edit.html"

我的模板位于 projectroot/templates/myapp。如果我的模型是 Django 模型,它工作正常,但对于基于 PageModel 的模型,创建视图仍然使用 wagtailadmin/pages/create.html。我还尝试了文档中提到的其他位置模式 w/o 成功。

是否可以更改 PageModel 的编辑和创建模板?还是应用与视图相同的限制,即只能覆盖 index.htmlinspect.html

根据 documentation note.

ModelAdmin 不提供页面模型的创建、编辑或删除功能

NOTE: modeladmin only provides ‘create’, ‘edit’ and ‘delete’ functionality for non page type models (i.e. models that do not extend wagtailcore.models.Page). If your model is a ‘page type’ model, customising any of the following will not have any effect.

这可能有点令人困惑,因为 ModelAdmin 系统似乎也适用于页面模型,但还有一些其他方法可以修改页面的编辑方式。不过,这些不会限定在 ModelAdmin 区域。

选项 1 - 为您的 MyPage 模型自定义生成的表单

例子

from django import forms
from django.db import models

from wagtail.admin.forms import WagtailAdminPageForm
from wagtail.core.models import Page


class EventPageForm(WagtailAdminPageForm):
      # ...


class MyPage(Page):
    # ...
    base_form_class = MyPageForm

选项 2 - 通过挂钩自定义视图

要自定义普通(例如,单击 Wagtail 用户栏或资源管理器上的编辑页面)页面编辑界面的创建和编辑视图,您将需要使用 Wagtail hooks。在这里您可以访问请求,因此您很可能能够确定您是否在 ModelAdmin 区域。

在您的应用程序文件夹中创建一个名为 wagtail_hooks.py 的文件并提供一个挂钩,该挂钩将 return 自定义响应(这需要由您的自定义视图呈现。)。

before_create_pagebefore_edit_page

有单独的钩子

来自下方 before_create_page docs 的示例。

from wagtail.core import hooks

from .models import AwesomePage
from .admin_views import edit_awesome_page

@hooks.register('before_create_page')
def before_create_page(request, parent_page, page_class):
    # Use a custom create view for the AwesomePage model
    if page_class == AwesomePage:
        return create_awesome_page(request, parent_page)
```python