应用需求: 设置好用户的权限之后, 用户登录后台之后,需要根据用户的权限,用户属于哪个组,显示哪些成员。 并且进入用户编辑页面之后, 设置显示用户的字段和字段显示方式
class MyUserAdmin(UserAdmin):
def get_queryset(self, request): //通过get_queryset函数可以过滤出组的成员, 或者这个过滤的规则有你自己定也行
qs = super(MyUserAdmin, self).get_queryset(request)
if request.user.is_superuser:
return qs
else:
return qs.filter(groups__name=mall_admin_group) | qs.filter(groups__name=mall_partner_group)
def get_fieldsets(self, request, obj=None): //通过get_fieldsets 过滤是否在User form page 显示相关字段
if not obj:
return self.add_fieldsets
if request.user.is_superuser:
perm_fields = ('is_active', 'is_staff', 'is_superuser', 'groups', 'user_permissions')
else:
perm_fields = ('is_active', 'is_staff', 'groups')
return [(None, {'fields': ('username', 'password')}), (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}), (_('Permissions'), {'fields': perm_fields}), (_('Important dates'), {'fields': ('last_login', 'date_joined')})]
admin.site.unregister(User)
admin.site.register(User, MyUserAdmin)
应用需求: 对不同组,不同用户设置在change_form.html中字段的可读权限的限制
1 def get_readonly_fields(self, request, obj=None): 2 fields = [] 3 user_info = User.objects.filter(groups__name=mall_admin_group).filter(username=request.user.username) 4 # 超级管理员和商城运营人员可以编辑 5 if request.user.is_superuser or user_info.exists(): 6 return fields 7 else: 8 fields = ['owner'] // owner字段无法编辑 9 return fields
应用需求: 在保存 model object 添加或者改变之前,可以对保存实例做一些限制工作,比如根据用户账号
1 def save_model(self, request, obj, form, change): 2 if not change: #add action 3 owner = obj.owner 4 partner_list = owner.partner_set.all() 5 # 新建店铺,每个账号仅限注册一个 6 if partner_list.exists(): 7 self.message_user(request, '每个账号只能创建一个店铺', messages.ERROR) 8 else: 9 super(PartnerAdmin, self).save_model(request, obj, form, change) 10 else:#change action 11 super(PartnerAdmin, self).save_model(request, obj, form, change)
应用需求: 将change_form中,input类型改为kindeditor插件功能。
1 from django import forms 2 3 class PartnerProductPoolForm(forms.ModelForm): 4 def __init__(self, *args, **kwargs): 5 super(PartnerProductPoolForm, self).__init__(*args, **kwargs) 6 self.fields["introduction"].label = "描述" //将该字段修改为kindeditor的textarea 7 introduction = forms.CharField(widget=forms.Textarea(attrs={'row': 60, 'cols': 120})) 8 class Meta: 9 model = PartnerProductPool 10 fields = '__all__' 11 12 class Media: //引入需要的js, css文件 13 js = ( 14 'js/jquery-3.2.1.min.js', 15 'editor/kindeditor-all.js', 16 'editor/lang/zh-CN.js', 17 'js/introduction.js' 18 )