zoukankan      html  css  js  c++  java
  • Django admin 继承user表后密码为明文,继承UserAdmin,重写其方法

    Django用户继承AbstractUser后密码为明文

    其实本不应该有这个问题,却花了我很久的时间,因为还是初学阶段。

    造成这个原因是因为在admin注册的生活没有指定Admin

    在app的admin.py里面

    from django.contrib.auth.admin import UserAdmin
    admin.site.register(UserProfile, UserAdmin)

    下面是重点,UserProfileAdmin继承UserAdmin

    model

    from django.db import models
    from django.contrib.auth.models import AbstractUser
    
    
    # Create your models here.
    
    # 继承原有user并且添加自定义user数据表
    class UserProfile(AbstractUser):
        ACCOUNT_TYPE = (
            ('advertiser', '广告主'),
            ('advertiser_agent', '广告主代理'),
            ('inside_staff', '公司内部员工')
        )
        ADVERTISEMENT_TYPE = (
            ('网赚类广告', '网赚类广告'),
            ('棋牌类广告', '棋牌类广告'),
            ('互动类广告', '互动类广告'),
            ('健康类广告', '健康类广告'),
        )
    
        account_person = models.IntegerField(verbose_name='建账号人', null=True, blank=True)
        if_show_gift_account = models.BooleanField(verbose_name='是否显示赠送金额', default=False)
        advertisement_type = models.CharField(verbose_name='广告类型', max_length=20, choices=ADVERTISEMENT_TYPE, null=True,
                                              blank=True)
    
        account_type = models.CharField(verbose_name='账号类型', max_length=20, choices=ACCOUNT_TYPE, default="advertiser")
        nick_name = models.CharField(max_length=50, verbose_name=u"昵称", null=True, blank=True)
        gender = models.CharField(verbose_name='性别', max_length=6, choices=(("male", u""), ("female", "")),
                                  default="male")
        address = models.CharField(verbose_name='地址', max_length=100, null=True, blank=True)
        mobile = models.CharField(verbose_name='电话', max_length=11, null=True, blank=True)
        add_time = models.DateTimeField(auto_now=True)
    
        class Meta:
            verbose_name = "广告主信息"
            verbose_name_plural = verbose_name
            permissions = (
                ('view_userprofile', 'view_userprofile'),
            )
    
        def __str__(self):
            return self.username

    Admin注册

    from django.contrib import admin
    from .models import UserProfile
    from django.contrib.auth.hashers import make_password
    from django.contrib.auth.models import User, Group,Permission
    from users.forms import UserProfileForm
    from rest_framework.response import Response
    from rest_framework import status
    from django.contrib.auth.admin import UserAdmin
    
    
    class UserProfileAdmin(UserAdmin):
        # form = UserProfileForm
        # FIXME 非管理员自定义返回fieldsets
        zdy_fieldsets = [(None, {'classes': ('wide', 'extrapretty'),
                 'fields': ('username', 'password', 'if_show_gift_account', 'advertisement_type')})]
    
        list_display = ('username', 'nick_name', 'account_type', 'if_show_gift_account', 'advertisement_type')
        list_filter = ('is_staff', 'is_superuser')
        #exclude = ('account_person','user_permissions',)
    
    
        def get_queryset(self, request):
            """
            admin 根据不同用户显示表格内容
            :param request:
            :return:
    .        """
    
            user_id = request.user.id
            userporfile = UserProfile.objects.get(id=user_id)
            # print(userporfile.account_type)
            if userporfile.account_type == 'advertiser_agent':
                qs = super().get_queryset(request)
                return qs.filter(account_person=user_id)
            else:
                return UserProfile.objects.all()
    
    
        def changelist_view(self, request, extra_context=None):
            """
            根据不同用户 显示list_display
            :param request:
            :param extra_context:
            :return:
            """
            user_id = request.user.id
            userporfile = UserProfile.objects.get(id=user_id)
            # print(userporfile.account_type)
            if userporfile.account_type != 'advertiser_agent':
                self.list_display = ['username', 'nick_name','advertisement_type','if_show_gift_account']
            else:
                self.list_display = ['username', 'nick_name']
            return super(UserProfileAdmin, self).changelist_view(request, extra_context=None)
    
        def get_readonly_fields(self, request, obj=None):
            """
            设置只读字段
            :param request:
            :param obj:
            :return:
            """
            if not request.user.is_superuser and request.user.has_perm('users.view_userprofile'):
                return [f.name for f in self.model._meta.fields]
            return []
    
        # FIXME 继承UserAdmin 重写get_fieldsets 方法指定显示哪些字段
        def get_fieldsets(self, request, obj=None):
            """
            显示指定字段
            :param request:
            :param obj:
            :return:
            """
            if request.user.is_superuser:
    
                return super(UserAdmin, self).get_fieldsets(request, obj)
            else:
                return self.zdy_fieldsets

    注册信息

    admin.site.register(UserProfile, UserProfileAdmin)
    
    
    
  • 相关阅读:
    LeetCode题解之Leaf-Similar Trees
    LeetCode题解之 Increasing Order Search Tree
    建立git仓库的步骤
    Jquery-1(基础)
    JavaScript-12(脚本化CSS)
    JavaScript-11(DOM文档对象模型)
    JavaScript-10(JavaScript事件)
    JavaScript-实现下拉菜单
    JavaScript-9(BOM浏览器对象模型)
    JavaScript-字符与编码转换
  • 原文地址:https://www.cnblogs.com/zhaoyingjie/p/9720520.html
Copyright © 2011-2022 走看看