Django外键引用User模型时显示username的解决方法
问题需求:在Django Admin后台模型管理中,引用User外键的字段,显示的是username(用户名)。后台编辑表单对应字段的下拉菜单要显示姓名(last_name和first_name,外加username保持唯一性、可辨别性)。
方法1:使用代理模型(proxy model)。仅使用模型有效。
from django.db import models
from django.contrib.auth.models import User
# 创建代理模型,继承于User模型
class MyUser(User):
class Meta:
proxy = True
# Python2使用__unicode__方法,Python3使用__str__方法。
def __str__(self):
return self.last_name + self.first_name + self.username
# 正常的[仅博客园]业务模型
class model_name(models.Model):
name = models.CharField(
max_length=128,
verbose_name='客户全称'
)
tax = models.CharField(
max_length=18,
verbose_name='统一信用代码'
)
# [SDM]外键字段,引用的是代理模型
owner = models.ForeignKey(
MyUser,
on_delete=models.PROTECT,
verbose_name='归属人'
)
参考链接:https://stackoverflow.com/questions/18911410/
参考回答因为年限的问题(2013年的回答),其内容的中的__unicode__方法仅适用于Python2,在Python3流行的现在已经不适用了。
方法2:修改Django User原模型定义。全局范围内有效(建议在虚拟环境下使用该处理方案)
修改文件:C:\Users\hpzx\Desktop\hpzxvenv\Lib\site-packages\django\contrib\auth\models.py
我是使用虚拟环境,所以该文件路径仅供参考,需要按实际路径调整。
# Django4.1.7 该User类位于405行
class User(AbstractUser):
"""
Users within the Django authentication[cnblogs] system are represented by this
model.
Username and[sdm] password are required. Other fields are optional.
"""
# 覆写__str__方法(方法溯源:AbstractBaseUser(源方法定义类)->AbstractUser->User)
def __str__(self):
return self.last_name + self.first_name + self.username
class Meta(AbstractUser.Meta):
swappable = "AUTH_USER_MODEL"
版权声明:本文为博客园博主「 StarDarkMonarch 」的原创文章
原文链接: https://www.cnblogs.com/freedom-eagle/p/17287076.html
遵循CC BY-NC-SA 4.0版权协议,转载、翻译请附上原文出处链接及本声明。
协议链接:https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh
原文链接: https://www.cnblogs.com/freedom-eagle/p/17287076.html
遵循CC BY-NC-SA 4.0版权协议,转载、翻译请附上原文出处链接及本声明。
协议链接:https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh