django中根据用户的权限,显示change_list.html的内容和change_form.html中显示的字段

应用需求: 设置好用户的权限之后, 用户登录后台之后,需要根据用户的权限,用户属于哪个组,显示哪些成员。 并且进入用户编辑页面之后, 设置显示用户的字段和字段显示方式

 

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             )

  

原文地址:https://www.cnblogs.com/learning-skills/p/7519891.html