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)

 


 

posted on   星河赵  阅读(1161)  评论(0编辑  收藏  举报

编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示