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"

参考链接:https://www.cnblogs.com/polly-ling/p/11810724.html

posted @ 2023-04-04 17:02  StarDarkMonarch  阅读(131)  评论(0编辑  收藏  举报