我正在使用wagtail开发博客应用。
关于博客页面的要点: 作家可以写“标题”,“简介”和“正文”。 首先,作者可以提交标题。 完成“标题任务”后,作者可以编辑和提交正文。 当作家执行标题任务时,作家不能编辑正文字段。 此外,当作者执行正文任务时,作者无法编辑标题字段。
我想动态更改titleField
和bodyField(RichTextField)
的权限,但是我不知道该怎么做。
我认为wagtail_hooks.py中有关@hooks.register("after_edit_page")
的编辑钩子可以解决。
我尝试使用PagePermissionHelper
,PermissionHelper
。
答案 0 :(得分:0)
WagtailAdminPageForm
扩展了Django ModelForm
,您可以进一步扩展它以添加自定义clean
/ __init__
/ save
等方法,以添加基本上任何逻辑您既想了解表单的呈现方式,又要了解应用保存之前向用户提供的错误。request
对象,但是可以通过save
方法获得它,因此可以在此处轻松地执行一些用户基本逻辑。 / li>
BlogPageForm
。ModelAdmin
并实质上只是完全独立于正常页面而构建博客工作流程结构,然后重组权限,以便博客编辑者无法访问常规页面树,而只能访问您的自定义工作流程。BlogPage
模型的自定义表单的基本示例。__init__
可以扩展为在表单生成方式上添加自定义逻辑(例如,使某些字段为只读或什至“隐藏”某些字段)。save
可以扩展为将服务器端验证添加到只读字段,并提供面向用户的错误消息。# other imports
from wagtail.admin.forms import WagtailAdminPageForm
class BlogPageForm(WagtailAdminPageForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
instance = getattr(self, 'instance', None)
if not instance.pk:
# this is a NEW blog entry form - only allow title to be enabled, disable other fields
self.fields['description'].widget.attrs['readonly'] = True
if instance.pk:
# assume title has been entered and saved at this point (required for a new post)
# disable the title field
self.fields['title'].widget.attrs['readonly'] = True
def clean(self):
cleaned_data = super().clean()
instance = getattr(self, 'instance', None)
title = cleaned_data['title']
description = cleaned_data['description']
if not instance.pk:
# this is a NEW blog entry, check that only the title has been entered
if not title:
self.add_error('title', 'title must be edited before all other fields')
return cleaned_data
if description:
self.add_error('description', 'description cannot be entered until title has been completed')
if instance.pk:
# an existing blog entry, do not allow title to be changed
print('title', instance.title, title)
if instance.title != title:
self.add_error('title', 'title cannot be edited after the initial save')
class BlogPage(Page):
# ...fields
base_form_class = BlogPageForm