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)
    
    
    
  • 相关阅读:
    CSS浮动(float、clear)通俗讲解
    JAVA 类的加载
    数据库操作 delete和truncate的区别
    正则表达式 匹配相同数字
    Oracle EBS OM 取消订单
    Oracle EBS OM 取消订单行
    Oracle EBS OM 已存在的OM订单增加物料
    Oracle EBS OM 创建订单
    Oracle EBS INV 创建物料搬运单头
    Oracle EBS INV 创建物料搬运单
  • 原文地址:https://www.cnblogs.com/zhaoyingjie/p/9720520.html
Copyright © 2011-2022 走看看