首页 > 解决方案 > 是否可以在 wagtail 中动态设置 edit_handlers?

问题描述

在 Wagtail (2.1) 中,我想显示edit_handlers基于instancePage 对象的 。在 Wagtail 中挖掘,我看到这edit_handlers是一个基于类的函数,因此没有可用的请求或实例对象。

这甚至可能吗?

据我所知,我只能通过覆盖基于函数的视图edithttps://github.com/wagtail/wagtail/blob/master/wagtail/admin/views/pages.py#L311)复制整个函数,并在此处更改 edit_handler 分配来实现这一点(https://github.com/wagtail/wagtail/blob/master/wagtail/admin /views/pages.py#L329 ) 基于latest_revision.

然后,我必须创建一个新urls.py的,以获取该特定页面类型的覆盖edit视图。

用例子更新

例如,我希望能够编辑 Storypage 的标签,以防登录用户名等于“tagman”。如果没有,那么我应该无法编辑标签。

默认使用 content_panels、promote_panels 和 setting_panels。但是,基于 request.user,我想显示promote_panels_alternative(包括标签)。

class StoryPage(Page):
    tags = ParentalManyToManyField('tags.Tag', blank=True, related_name='tags')

    edit_handler = CustomEditHandler

    promote_panels_alternative = Page.promote_panels + [FieldPanel('tags', widget=forms.CheckboxSelectMultiple), ]


class CustomEditHandler(TabbedInterface): ?

在这个 CustomEditHandler 类(我不确定要从哪个子类化)中,我会覆盖一个方法(不确定是哪一个),默认情况下会创建选项卡https://github.com/wagtail/wagtail/blob/master/wagtail/admin/edit_handlers.py#L785,然后基于instance或者request我可以建立TabbedInterface使用StoryPage.promote_panels_alternative代替的StoryPage.promote_panels

标签: djangowagtail

解决方案


无需覆盖edit视图。页面实例可作为self.instance. 从 Wagtail 2.1 开始,请求可以作为self.request.


推荐阅读