Cea*_*sta 5 django admin fieldset
我正在尝试为模型编写一个动态表单,允许具有不同权限的用户做不同的事情。我希望下面的代码能够正常运行,以便非超级用户无法编辑“商家”块中的任何字段。
class CategoryModelAdmin(LWModelAdmin):
fieldsets = (
('Merchant', {'fields': ('merchant',) }),
('Category', { 'fields': ('name', 'parent',) }),
)
def get_form(self,request,obj=None, **kwargs):
if request.user.is_superuser:
self.exclude = []
else:
self.exclude = ['Merchant']
return super(CategoryModelAdmin,self).get_form(request, obj=None, **kwargs)
Run Code Online (Sandbox Code Playgroud)
虽然我可以通过下面的代码实现这种效果,但我真的在寻找“正确”的方法来做到这一点,感觉使用 exclude 是可行的方法,但无论如何我似乎都无法做到我试试。
class CategoryModelAdmin(LWModelAdmin):
declared_fieldsets = None
admin_fieldsets = (
(None, {'fields': ('merchant',) }),
('Category', { 'fields': ('name', 'parent',) }),
)
restricted_fieldsets = (
('Category', { 'fields': ('name', 'parent',) }),
)
def get_fieldsets(self, request, obj=None):
if request.user.is_superuser:
fieldsets = self.admin_fieldsets
else:
fieldsets = self.restricted_fieldsets
return LWModelAdmin.fieldsets + fieldsets
def get_form(self, request, obj=None, **kwargs):
self.declared_fieldsets = self.get_fieldsets(request, obj)
return super(self.__class__, self).get_form(request, obj)
Run Code Online (Sandbox Code Playgroud)
您的代码不是线程安全的,您不应该self.exclude在自定义 ModelAdmin 方法中设置自身属性(等)。而是使用 kwargs ofModelAdmin.get_form和InlineModelAdmin.get_formset来得到你想要的。
这是一个简单的例子:
class CategoryModelAdmin(LWModelAdmin):
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
kwargs['exclude'] = ['foo', 'bar',]
else:
kwargs['fields'] = ['foo',]
return super(CategoryModelAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4054 次 |
| 最近记录: |