Wagtail:如何覆盖 PageModel 的 create/edit 模板
Wagtail: How to overwrite create/edit template for PageModel
我想覆盖 create.html
和 edit.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.html
和 inspect.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
模型自定义生成的表单
- 如果您只想自定义编辑页面 表单 的生成方式,您可以修改页面模型上的
base_form_class
。
- Wagtail 有关于 how to create a custom page form 的文档。
- 注意:
WagtailAdminPageForm
扩展 Django's 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 hooks。在这里您可以访问请求,因此您很可能能够确定您是否在 ModelAdmin
区域。
在您的应用程序文件夹中创建一个名为 wagtail_hooks.py
的文件并提供一个挂钩,该挂钩将 return 自定义响应(这需要由您的自定义视图呈现。)。
before_create_page
和 before_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
我想覆盖 create.html
和 edit.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.html
和 inspect.html
?
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
模型自定义生成的表单
- 如果您只想自定义编辑页面 表单 的生成方式,您可以修改页面模型上的
base_form_class
。 - Wagtail 有关于 how to create a custom page form 的文档。
- 注意:
WagtailAdminPageForm
扩展 Django's 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 hooks。在这里您可以访问请求,因此您很可能能够确定您是否在 ModelAdmin
区域。
在您的应用程序文件夹中创建一个名为 wagtail_hooks.py
的文件并提供一个挂钩,该挂钩将 return 自定义响应(这需要由您的自定义视图呈现。)。
before_create_page
和 before_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