python - Wagtail:如何覆盖 PageModel 的创建/编辑模板
问题描述
我想覆盖create.html
并edit.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
可以覆盖?
解决方案
ModelAdmin
根据文档说明,不提供页面模型的创建、编辑或删除功能。
注意:modeladmin 只为非页面类型模型(即不扩展 wagtailcore.models.Page 的模型)提供“创建”、“编辑”和“删除”功能。如果您的模型是“页面类型”模型,则自定义以下任何一项都不会产生任何效果。
这可能有点令人困惑,因为该ModelAdmin
系统似乎也适用于页面模型,但还有一些其他方法可以修改页面的编辑方式。但是,这些将不限于该ModelAdmin
区域。
选项 1 - 为您的MyPage
模型自定义生成的表单
- 如果您只想自定义生成的编辑页面表单的方式,您可以修改
base_form_class
页面模型。 - Wagtail 有关于如何创建自定义页面表单的文档。
- 注意:
WagtailAdminPageForm
扩展Django 的 ModelFormMetaClass
例子
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
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
推荐阅读
- python - 如何来回多次切换pyqt5对话框?
- python - 如何在 python 中使用 pandas 从 csv 文件中读取?
- laravel - 未找到所有laravel路由
- ipfs - 启动js-ipfs节点时如何启动api网关?
- javascript - Bootstrap 4 Popover CSS 不会动态更改
- php - 是否可以在定义变量之前引用它?
- python - 如何在没有子数据的情况下获得价值?
- php - 在 CentOS 7 上以普通用户而不是 root/超级用户身份运行 composer
- javascript - 我的石头、纸、剪刀的功能不起作用
- rust - Vec 的 Option::take() 等价物是什么
?