我的应用程序有一些可以使用 modelAdmin 编辑的模型。某些字段面板是否可能对某些类型的用户隐藏?
我在文档中找不到如何根据用户类型动态修改 edit_handler 。
我的应用程序有一些可以使用 modelAdmin 编辑的模型。某些字段面板是否可能对某些类型的用户隐藏?
我在文档中找不到如何根据用户类型动态修改 edit_handler 。
您可以继承FieldPanel
和覆盖render_as_field
and/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()
另一种方法。使该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'),
]
...现在,如果是我,我可能会选择设置两个完全不同的面板,即使它们会保持在一起并且看起来相同。因为,“迟早”,一种观点会与另一种观点发生分歧,这会很快增加复杂性。因此,尽管通过“选择性地隐藏东西”来解决这个问题可能很有吸引力,但你可能会希望你没有这样做。我认为最好有两个冗余面板,每个面板都有一个干净的实现,而不是有两段代码到处都是if
- 语句......但这完全是我的意见。
除了上面的答案(抱歉,无法添加评论)。
而不是render_as_field
有时你应该使用render_as_object
. 这取决于。
我最近发现了另一种方法(也面临这个问题)。如果您不需要隐藏面板而只将其设为只读,则可以创建假设从基础和覆盖方法NewFieldPanel
继承(最初在这里找到提示)。FieldPanel
bind_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
)