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

如何在Django中让updated_by字段显示用户全名?

问题解决步骤

1. 修正模型字段定义

你当前的updated_by字段写法存在两处关键错误:

  • ForeignKey需要关联User模型类,而非调用User.get_full_name()(这会返回字符串,不是合法的关联模型)
  • default='None'是字符串类型,不符合ForeignKey的参数要求,应改为default=None,同时配合null=True允许字段为空

修改后的updated_by字段代码:

updated_by = models.ForeignKey(
    User,
    verbose_name='更新人',
    on_delete=models.SET_NULL,
    null=True,
    blank=True,
    default=None
)

说明:

  • on_delete=models.SET_NULL:当关联的用户被删除时,该字段自动设为Null
  • null=True和blank=True:允许数据库中该字段为空,适配无用户关联的场景

2. 执行数据库迁移

no such column: device.updated_by_id错误的核心原因是:你修改了模型但未同步数据库结构。在项目根目录执行以下命令:

python manage.py makemigrations
python manage.py migrate

这会生成迁移文件并将新字段同步到数据库中。

3. 实现显示用户全名的需求

不要直接存储用户全名(否则用户修改姓名后数据不会自动更新),应在显示层调用User模型的get_full_name()方法:

方法一:模板中直接调用

在表格模板里直接写:

<td>更新人:{{ device.updated_by.get_full_name|default:"未记录" }}</td>

|default:"未记录"用于处理updated_by为空的情况,显示默认文本。

方法二:模型中添加属性方法(可选)

如果需要在多个地方复用显示逻辑,可在Device模型里添加只读属性:

class Device(models.Model):
    # 其他字段...
    updated_by = models.ForeignKey(...)  # 已修正的字段

    @property
    def updated_by_full_name(self):
        if self.updated_by:
            return f"更新人:{self.updated_by.get_full_name()}"
        return "更新人:未记录"

之后在模板中直接使用:

<td>{{ device.updated_by_full_name }}</td>

额外提示

如果需要自动将updated_by设为当前登录用户(比如创建/修改设备时),可在Admin类中重写save_model方法:

from django.contrib import admin
from .models import Device

class DeviceAdmin(admin.ModelAdmin):
    def save_model(self, request, obj, form, change):
        obj.updated_by = request.user
        super().save_model(request, obj, form, change)

admin.site.register(Device, DeviceAdmin)

这样在后台修改设备时,updated_by会自动赋值为当前登录用户。

内容的提问来源于stack exchange,提问作者user21402031

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 09:20:16