在Django中,我有超级用户和一组内容编辑器。
当我以超级用户身份编辑模型时,我希望能够编辑所有字段。如果有人以编辑者身份登录,我想允许他仅编辑特定字段。
我已经用get_form
方法做到了:
class VideoAdmin(admin.ModelAdmin):
editor_fields = ('description','description_rewrited')
def get_form(self, request, obj=None, **kwargs):
if not hasattr(request.user, 'perms_list'):
request.user.perms_list = request.user.groups.values_list('name',flat=True)
if 'video_description_rewriter' in request.user.perms_list:
print('rewrite fields to normal')
self.fields = self.normaluser_fields
return super(VideoAdmin, self).get_form(request, obj, **kwargs)
这个对我有用。但是,当我打开视频进行常规编辑时,它将超级用户字段设置为编辑器字段设置。
我假设存在某种模板缓存?
你设置self.fields
到self.normaluser_fields
当用户编辑器,但你不设置self.fields
回来时,用户是管理员默认值。ModelAdmin
对象是在应用程序加载时创建的,它们在所有用户之间共享!
在管理员进入页面时将字段更改回默认值将无法100%解决问题。当管理员和非管理员用户尝试同时进入编辑页面时,可能会发生争用情况。他们两个都可以得到相同的字段。
除了重新编写外get_form
,您还可以通过重新编写get_fields
方法来使其更简单:
def get_fields(self, request):
if not hasattr(request.user, 'perms_list'):
request.user.perms_list = request.user.groups.values_list('name',flat=True)
if 'video_description_rewriter' in request.user.perms_list:
print('rewrite fields to normal')
return self.normaluser_fields
return self.fields
该方法不会覆盖ModelAdmin
对象中的任何值,因此更改仅对一个用户可见。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句