如何在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:当关联的用户被删除时,该字段自动设为Nullnull=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
相关产品推荐
相关产品推荐

