0

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

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

4

5 回答 5

1

您可以继承FieldPanel和覆盖render_as_fieldand/orrender_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()
于 2018-11-19T18:21:15.407 回答
1

另一种方法。使该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'),   
    ]

于 2019-06-17T16:50:14.020 回答
0

...现在,如果是我,我可能会选择设置两个完全不同的面板,即使它们会保持在一起并且看起来相同。因为,“迟早”,一种观点与另一种观点发生分歧,这会很快增加复杂性。因此,尽管通过“选择性地隐藏东西”来解决这个问题可能很有吸引力,但你可能会希望你没有这样做。我认为最好有两个冗余面板,每个面板都有一个干净的实现,而不是有两段代码到处都是if- 语句......但这完全是我的意见。

于 2018-11-22T16:19:06.740 回答
0

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

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

于 2018-11-24T15:18:15.197 回答
0

我最近发现了另一种方法(也面临这个问题)。如果您不需要隐藏面板而只将其设为只读,则可以创建假设从基础和覆盖方法NewFieldPanel继承(最初在这里找到提示)。FieldPanelbind_to_instance

实现示例:

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
        )
于 2018-11-21T23:07:15.113 回答