我有一个简单的MyUser课PermissionsMixin.user.is_superuser等于True只能由超级用户.我希望能够在我的网站上做类似的事情admin.py:
if request.user.is_superuser:
fieldsets = (
(None, {'fields': ('email', 'password')}),
('Permissions', {'fields': ('is_admin','is_staff')}),
('Place', {'fields': ('place',)}),
('Important dates', {'fields': ('last_login',)}),
)
else:
fieldsets = (
(None, {'fields': ('email', 'password')}),
#('Permissions', {'fields': ('is_admin','is_staff')}),
('Place', {'fields': ('place',)}),
('Important dates', {'fields': ('last_login',)}),
)
Run Code Online (Sandbox Code Playgroud)
基本上我希望我的用户能够创建其他用户,但不要给他们管理员或东西权限.只有超级用户才能做到这一点.
yuv*_*uvi 17
如果我理解正确,您要做的是覆盖ModelAdmin的get_form方法.此基础上从Django文档的例子,它会是这个样子:
class MyUserAdmin(admin.ModelAdmin):
def get_form(self, request, obj=None, **kwargs):
self.exclude = []
if not request.user.is_superuser:
self.exclude.append('Permissions') #here!
return super(MyUserAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)
现在你可能需要稍微破解一下,也可以覆盖save方法.我不久前做了类似的事情,它不是那么复杂(而且文档很棒).
可能有一个更简单的解决方案,但你的问题有点笼统,你没有分享你的用户模型,所以我无法告诉你如何解决这个问题.我希望这有帮助!
Mat*_*att 17
接受的答案很接近,但正如其他人指出的那样,get_form在Admin模型的同一个实例上被多次调用,并且实例被重用,因此您可以最终重复使用字段或其他用户在self.fields被修改后看到字段.在Django <= 1.6中试试这个:
class MyAdmin(admin.ModelAdmin):
normaluser_fields = ['field1','field2']
superuser_fields = ['special_field1','special_field2']
def get_form(self, request, obj=None, **kwargs):
if request.user.is_superuser:
self.fields = self.normaluser_fields + self.superuser_fields
else:
self.fields = self.normaluser_fields
return super(MyAdmin, self).get_form(request, obj, **kwargs)
Run Code Online (Sandbox Code Playgroud)
看起来,Django 1.7引入了一个get_fields()方法,你可以覆盖这是一个更好的方法:
Django 现在get_exclude在 ModelAdmin 上有一个方法来以编程方式排除字段。
它将当前请求和对象(如果有)作为参数。您可以在 request 参数上进行检查以查看他们是否是超级用户并检查
class MyModelAdmin(admin.ModelAdmin):
def get_exclude(self, request, obj=None):
excluded = super().get_exclude(request, obj) or [] # get overall excluded fields
if not request.user.is_superuser: # if user is not a superuser
return excluded + ['extra_field_to_exclude']
return excluded # otherwise return the default excluded fields if any
Run Code Online (Sandbox Code Playgroud)