是否可以在w中动态设置edit_handlers?

时间:2018-06-19 18:34:32

标签: django wagtail

在Wagtail(2.1)中,我想基于Page对象的edit_handlers显示instance。 在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视图中进行选择。

使用示例更新

作为一个例子,如果登录的用户名等于“ tagman”,我希望能够编辑一个Storypage的Tag。如果没有,那么我应该不能编辑标签。

默认情况下,使用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,然后基于instancerequest可以使用TabbedInterface代替StoryPage.promote_panels_alternative来构建StoryPage.promote_panels

1 个答案:

答案 0 :(得分:-1)

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