首页 > 解决方案 > Wagtail:如何覆盖 PageModel 的创建/编辑模板

问题描述

我想覆盖create.htmledit.html用于从 Wagtails 'PageModel' 派生的模型。

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

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. 我还尝试了文档中提到的其他位置模式,但没有成功。

是否可以更改编辑并为 a 创建模板PageModel?或者是否适用与视图相同的限制,即仅适用index.html并且inspect.html可以覆盖?

标签: pythonwagtail

解决方案


ModelAdmin根据文档说明,不提供页面模型的创建、编辑或删除功能。

注意:modeladmin 只为非页面类型模型(即不扩展 wagtailcore.models.Page 的模型)提供“创建”、“编辑”和“删除”功能。如果您的模型是“页面类型”模型,则自定义以下任何一项都不会产生任何效果。

这可能有点令人困惑,因为该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 钩子。在这里,您可以访问请求,因此您可能能够确定您是否在该ModelAdmin区域。

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

before_create_page和_before_edit_page

before_create_page以下文档中的示例。

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

推荐阅读