You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:36