zoukankan      html  css  js  c++  java
  • 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             )

      

  • 相关阅读:
    php基本语法与安装
    面向对象编程 es5和es6的构造函数
    利用正则搜索替换
    正则特殊符号
    正则边界符 限定符
    面试官给我挖坑:rm删除文件之后,空间就被释放了吗?
    为什么 IPv6 难以取代 IPv4
    Docker系列教程04-Docker构建镜像的三种方式
    Docker系列教程03-Docker私有仓库搭建(registry)
    Linux-I/O模型详解
  • 原文地址:https://www.cnblogs.com/learning-skills/p/7519891.html
Copyright © 2011-2022 走看看