我的应用程序具有一些可以使用modelAdmin编辑的模型。某些类型的用户是否可能隐藏某些字段面板?
我在文档中找不到如何根据用户类型动态修改edit_handler的信息。
答案 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'),
]