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)
分类:
Django
, Python常用方法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了