根据用户类型动态自定义edit_handler

时间:2018-11-15 15:27:37

标签: wagtail modeladmin

我的应用程序具有一些可以使用modelAdmin编辑的模型。某些类型的用户是否可能隐藏某些字段面板?

我在文档中找不到如何根据用户类型动态修改edit_handler的信息。

5 个答案:

答案 0 :(得分:1)

您可以将FieldPanel子类化,并覆盖render_as_field和/或render_as_object方法。在这些方法中,您将有权访问请求,该请求已绑定到bind_to_instance中的模型(请参见https://github.com/wagtail/wagtail/blob/master/wagtail/admin/edit_handlers.py#L137)。

这是一个例子:

from wagtail.admin.edit_handlers import FieldPanel


class CustomFieldPanel(FieldPanel):

    def render_as_field(self):
        if not self.request.user.is_superuser:
            return ''
        return super().render_as_field()

答案 1 :(得分:0)

我最近发现了另一种方法(也面临这个问题)。 如果您不需要隐藏面板,而只需将其设置为只读,则可以创建NewFieldPanel,它继承自基本FieldPanel,并覆盖bind_to_instance方法(最初发现了提示{ {3}}。

实施示例:

class NewFieldPanel(FieldPanel):
    def bind_to_instance(self, instance=None, form=None, request=None):
        # form.fields['managers'].widget = HiddenInput()
        form.fields['managers'].disabled = True
        return super().bind_to_instance(
            instance=instance, form=form, request=request
        )

答案 2 :(得分:0)

...现在,如果是 me ,我可能会选择建立两个完全不同的面板,即使它们将保持在一起并且看起来一样。因为“早晚”,一个视图将 与另一视图分开,这会很快增加复杂性。因此,尽管可能通过“选择性地隐藏事物”来解决此问题很有吸引力,但您可能会希望自己没有这样做。我认为最好有两个冗余的面板,每个面板都有一个清晰的实现,而不是让两个代码都被if语句所淹没……但这完全是我的看法。

答案 3 :(得分:0)

除了上述答案(抱歉,无法添加评论)。

有时您应该使用render_as_field而不是render_as_object。这取决于。

答案 4 :(得分:0)

另一种方法。使required_fields方法返回一个空列表。

# panels.py
from wagtail.admin.edit_handlers import FieldPanel


class PermissionFieldPanel(FieldPanel):
    def __init__(self, *args, permission: str, **kwargs):
        super().__init__(*args, **kwargs)
        self.permission = permission

    def clone_kwargs(self):
        kwargs = super().clone_kwargs()
        kwargs['permission'] = self.permission
        return kwargs

    def required_fields(self):
        if self.request and self.request.user.has_perm(self.permission):
            return super().required_fields()
        return []

# models.py
from wagtail.core.models import Page

form panels import PermissionFieldPanel


class ArticlePage(Page):
    admin_notes = models.TextField(blank=True)

    settings_panels = Page.settings_panels + [
         PermissionFieldPanel('admin_notes', permission='myapp__some_permission'),   
    ]