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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:48:04