Django获取User的first_name问题:Admin中用户全名显示异常
解决Django Admin中UserDetails模型显示用户全名异常的问题
看起来你遇到的问题大概率是外键字段名引用错误或者空值未处理导致的,我来一步步帮你排查解决:
1. 检查UserDetails模型的外键定义
首先确认你的UserDetails模型里,关联User的外键字段名是不是小写的user(Django惯例是用小写模型名作为外键字段名),比如正确的模型定义应该是这样:
from django.db import models from django.contrib.auth import get_user_model User = get_user_model() class UserDetails(models.Model): # 注意这里是小写的user,不是User user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='user_details') # 你的其他额外字段,比如address, phone等
你之前写的self.User(大写U)是错误的——模型里并没有名为User的字段,应该改成self.user(小写u)。
2. 修复__str__方法并处理空值
很多用户可能没填写first_name或last_name,直接拼接会出现空字符串甚至报错,建议优化__str__方法,加入空值处理:
def __str__(self): # 拼接全名并去掉首尾空格 full_name = f"{self.user.first_name} {self.user.last_name}".strip() # 如果全名为空(比如用户只填了用户名),就显示用户名作为备选 return full_name or self.user.username
如果存在UserDetails未关联任何User的情况(虽然一对一关联下这种情况应该避免),还可以再加一层判断防止报错:
def __str__(self): if not self.user: return "未关联用户的详情" full_name = f"{self.user.first_name} {self.user.last_name}".strip() return full_name or self.user.username
3. 确认Admin配置(可选)
如果上述修改后还是有问题,检查你的admin.py里是否正确注册了UserDetails,并配置了正确的显示字段:
from django.contrib import admin from .models import UserDetails class UserDetailsAdmin(admin.ModelAdmin): # 这里可以直接把__str__加入显示列表,或者单独指定字段 list_display = ('__str__', 'phone', 'address') # 替换成你的实际字段 admin.site.register(UserDetails, UserDetailsAdmin)
为什么之前的代码会报错?
你写的self.User会触发Django的模型属性查找,但你的模型里并没有定义名为User的字段,所以会抛出AttributeError——这就是你看到异常的原因。另外,即使字段名正确,如果用户的first_name或last_name为空,直接拼接可能会出现不友好的空白,所以空值处理很有必要。
内容的提问来源于stack exchange,提问作者Donovan Keating
相关产品推荐
相关产品推荐

