Django admin List Display + ForeignKey = Empty Change List

Posted

技术标签:

【中文标题】Django admin List Display + ForeignKey = Empty Change List【英文标题】: 【发布时间】:2012-02-15 01:04:39 【问题描述】:

我在 django admin list_display 中遇到了一个奇怪的问题。每当我向list_display 添加外键时,整个更改列表视图都会变为空白,仅显示条目总数。

models.py:

class Organization(models.Model):
    org_id = models.AutoField(primary_key=True)
    org_name = models.CharField(max_length=288)

    def __unicode__(self):
        return self.org_name

    class Meta:
        db_table = u'organization'

class Server(models.Model):
    server_id = models.AutoField(primary_key=True)
    server_name = models.CharField(max_length=135,verbose_name="Server Name")
    org = models.ForeignKey(Organization,verbose_name="Organization")   

    def __unicode__(self):
        return self.server_name

    class Meta:
        db_table = u'server'

admin.py:

class ServerAdmin(admin.ModelAdmin):
    list_display = ('server_name','org') 
admin.site.register(Server,ServerAdmin) 

现在我希望这段代码能在ChangeList View 中显示组织名称,但我得到了这个:

如果我在 list_displayServerAdmin 类中删除 org,我会得到:

我没有修改模板或覆盖任何ModelAdmin 方法。我使用 mysql(5.1.58) 作为 ubuntu 11.10 存储库附带的数据库。

如果我能解决这个问题,我会非常高兴。提前致谢。

【问题讨论】:

models.py 我看到TlxServeradmin.py 只是Server。是不是打错字了? 您不需要定义自动字段。 Django 自动为每个表创建一个主键。 @jcollado:这是一个错字:P 它假设是“服务器” @dan-klasson:我从旧数据库中获取模型。我跑了inspectdb,得到了模型,我得到了IntegerField作为主键,所以我把它们改成了AutoFiled 【参考方案1】:

我第二次 Stefano 关于要添加 null=True, blank=True 的事实。但是,我认为您只需要将其添加到 Organization 模型的 org_name 字段中。那应该可以通过。必须这样做,因为您已经运行 inspectdb 从旧数据库创建模型。数据库中的organization 表可能存储了一个空字符串。因此,添加上述内容将允许管理员显示一个空白字段/列。

此外,您还可以在不想像上面那样更改模型定义的情况下尝试使用callbacks。

【讨论】:

好的!与Organization 这样的另一个模型有类似的情况,它有一个ForeignKeyUser。感谢您和 django-debug-toolbar Zero'd on INNER JOINS 导致整个问题。 inspectdb 没有指定null=True,balnk=True,我太懒了;)交叉检查模型和数据库。谢谢伙计,我欠你一个人来解决这个看似神秘的问题。 随时盘努。所有人都在这里学习,我也从你的问题中吸取了教训。【参考方案2】:

尝试将null=True, blank=True 添加到所有模型字段。

如果行不验证模型约束,通常 django admin 会静默失败(因此在列表中不显示任何记录)。

【讨论】:

【参考方案3】:

见:https://***.com/a/163968/1104941

以下内容对您有用吗?

admin.py:

class ServerAdmin(admin.ModelAdmin):
    list_display = ('server_name','org__org_name') 
admin.site.register(Server,ServerAdmin) 

【讨论】:

我尝试了您的解决方案,虽然听起来很奇怪,但似乎没有用。它不断弹出错误'org__org_name' is not a callable or an attribute of 'ServerAdmin' or found in the model 'Server'.,无论如何,谢谢。 您不能在 list_display 中使用跨越关系的术语,这可能非常有用。一种解决方法是在 ModelAdmin 子类中定义一个返回您要查找的值的方法,并将该方法的名称添加到 list_display。【参考方案4】:

我遇到了类似的问题并像这样解决了它(使用您的示例):

class ServerAdmin(admin.ModelAdmin):
    list_display = ('server_name', 'get_org') 

    def get_org(self, obj):
        return obj.org.org_name

    get_org.short_description = 'Org'

admin.site.register(Server,ServerAdmin)

【讨论】:

以上是关于Django admin List Display + ForeignKey = Empty Change List的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略在 django admin list_display 中加载巨大的字段?

在 django admin 中加入两个表以获取 display_list 的列

Django admin list_display模型方法

如何在 Django admin 中本地化 list_display 字段?

Django admin list_display 在鼠标悬停时显示全文

Django Admin list_display 添加列[统计相关ForeignKey的记录]