Django Admin出现Unable to lookup报错及外键下拉显示异常求助
问题根因说明
- AttributeError报错根因:
Model._meta.get_fields()会返回模型所有关联字段,包括反向关联的虚拟字段(即instruction模型对activity的外键产生的反向引用字段),这类虚拟字段不能直接加入list_display渲染,访问activity列表页时触发字段查找异常。 - 外键下拉框仅显示类名根因:activity模型的
__str__方法固定返回类名self.__class__.__name__,Django admin外键下拉框默认取关联模型的__str__返回值作为选项文本。
解决方案
1. 修复下拉框显示逻辑
修改activity模型的__str__方法,直接返回活动标题即可让关联下拉框展示对应内容:
class activity(models.Model): title = models.CharField(max_length=30,default=None) date_created = models.DateTimeField(auto_now_add=True) date_updated = models.DateTimeField(auto_now=True) author = models.ForeignKey(User,on_delete=models.CASCADE,default=None) def __str__(self): # 可添加空值兼容逻辑:return self.title if self.title else "未命名活动" return self.title
2. 修复admin访问报错+字段中文翻译
第一步:给模型字段添加中文标注
在模型字段定义中加入verbose_name参数,admin会自动读取该参数作为表头、表单字段的中文显示内容:
class activity(models.Model): title = models.CharField("活动标题", max_length=30,default=None) date_created = models.DateTimeField("创建时间", auto_now_add=True) date_updated = models.DateTimeField("更新时间", auto_now=True) author = models.ForeignKey(User,on_delete=models.CASCADE,default=None, verbose_name="创建人") def __str__(self): return self.title class instruction(models.Model): detail = models.CharField("指引详情", max_length=50,default=None) date_created = models.DateTimeField("创建时间", auto_now_add=True) date_updated = models.DateTimeField("更新时间", auto_now=True) author = models.ForeignKey(User,on_delete=models.CASCADE,default=None, verbose_name="创建人") activity = models.ForeignKey(activity,on_delete=models.CASCADE,default=None, verbose_name="关联活动") def __str__(self): return self.detail
第二步:修正admin的list_display配置
过滤掉反向关联的虚拟字段,只保留当前模型的实字段用于列表渲染:
class activityAdmin(admin.ModelAdmin): # 排除一对多的反向关联字段,避免查找异常 list_display = [field.name for field in activity._meta.get_fields() if not field.one_to_many] class instructionAdmin(admin.ModelAdmin): list_display = [field.name for field in instruction._meta.get_fields() if not field.one_to_many] admin.site.register(activity, activityAdmin) admin.site.register(instruction, instructionAdmin)
内容的提问来源于stack exchange,提问作者Sirc.Sbat
相关产品推荐
相关产品推荐

