如何在Django中通过函数实现关联表字段在Admin后台的正常显示
问题原因
你遇到的报错是因为在自定义user_dept方法中直接返回了Account类的department字段对象,没有绑定具体的用户实例,所以输出的是字段类本身的内存地址,而不是实例对应的字段值。
修复步骤
1. 修正自定义展示方法
将RiskRegisterAdmin中的user_dept方法改为从当前行的实例对象中取关联用户的部门值:
def user_dept(self, obj): # obj是当前行的RiskRegister实例,user是关联的Account实例 return obj.user.department
同时可以给该字段增加展示名、排序支持,在方法下方补充配置:
# 设置Admin列表页该列的表头名称 user_dept.short_description = '用户部门' # 设置点击该列表头时的排序规则,关联到Account表的department字段 user_dept.admin_order_field = 'user__department'
2. 修正搜索字段配置
Django Admin的search_fields不支持直接搜索自定义方法的字段,你需要用双下划线语法直接关联到Account表的department字段实现搜索,修改search_fields配置:
search_fields = ['id', 'user__username', 'user__department', 'date', 'category', 'roles', 'responderID', 'severity', 'created_at']
这里额外增加了user__username支持搜索用户名,你可以根据实际需求调整。
前提:你的
RiskRegister模型中user字段必须是外键关联到Account模型,以上配置才能正常生效。
修改后完整admin.py代码
from django.contrib import admin from .models import RiskRegister, Category, Severity, RSev from account.models import Account class RiskRegisterAdmin(admin.ModelAdmin): list_display = ['id', 'user', 'user_dept', 'date', 'category', 'roles', 'responderID', 'severity', 'action_taken_explanation', 'created_at'] list_filter = ['id', 'user', 'date', 'category', 'roles', 'responderID', 'severity', 'action_taken_explanation'] search_fields = ['id', 'user__username', 'user__department', 'date', 'category', 'roles', 'responderID', 'severity', 'created_at'] def user_dept(self, obj): return obj.user.department user_dept.short_description = '用户部门' user_dept.admin_order_field = 'user__department'
内容的提问来源于stack exchange,提问作者Iyanuoluwa Loko
相关产品推荐
相关产品推荐

