有什么方法可以使w体字段为只读?

时间:2019-07-06 07:53:12

标签: django wagtail

我正在使用wagtail开发博客应用。

关于博客页面的要点: 作家可以写“标题”,“简介”和“正文”。 首先,作者可以提交标题。 完成“标题任务”后,作者可以编辑和提交正文。 当作家执行标题任务时,作家不能编辑正文字段。 此外,当作者执行正文任务时,作者无法编辑标题字段。

我想动态更改titleFieldbodyField(RichTextField)的权限,但是我不知道该怎么做。

我认为wagtail_hooks.py中有关@hooks.register("after_edit_page")的编辑钩子可以解决。 我尝试使用PagePermissionHelperPermissionHelper

1 个答案:

答案 0 :(得分:0)

建议的解决方案

  • 有关Customising generated forms的Wagtail文档说明了一种方法,用于覆盖在编辑/创建新页面时生成的表单。
  • WagtailAdminPageForm扩展了Django ModelForm,您可以进一步扩展它以添加自定义clean / __init__ / save等方法,以添加基本上任何逻辑您既想了解表单的呈现方式,又要了解应用保存之前向用户提供的错误。
  • Django ModelForm documentation
  • 默认情况下,您在表单创建时不需要访问request对象,但是可以通过save方法获得它,因此可以在此处轻松地执行一些用户基本逻辑。 / li>
  • 如果需要进一步的自定义,则可以深入研究Wagtail edit handers(搜索源代码),并创建自己的编辑处理程序,该处理程序可以将请求传递给自定义BlogPageForm
  • li>
  • 注意:如果最终目标是添加一个完整的基于“流程”的页面编辑工作流程,则可能要看一下Wagtails的ModelAdmin并实质上只是完全独立于正常页面而构建博客工作流程结构,然后重组权限,以便博客编辑者无法访问常规页面树,而只能访问您的自定义工作流程。

示例代码

  • 这只是BlogPage模型的自定义表单的基本示例。
  • __init__可以扩展为在表单生成方式上添加自定义逻辑(例如,使某些字段为只读或什至“隐藏”某些字段)。
  • save可以扩展为将服务器端验证添加到只读字段,并提供面向用户的错误消息。
  • 通过检查self.instance.pk(主键)是否存在,可以添加用于创建“新”页面的逻辑以及用于编辑现有页面的逻辑。
# 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