Django admin 列表显示 + 外键 = 空的更改列表

7 投票
4 回答
6239 浏览
提问于 2025-04-17 10:42

我在Django的管理后台遇到了一个奇怪的问题,关于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中显示组织名称,但结果却是这样:

空的列表 :(

如果我把ServerAdmin类中的org去掉,列表就会显示数据:

有数据的列表 :(

我没有修改任何模板,也没有重写ModelAdmin的方法。我使用的是Mysql(5.1.58),这是Ubuntu 11.10自带的数据库。

如果有人能帮我解决这个问题,我会非常感激。谢谢大家!

4 个回答

2

请查看这个链接:https://stackoverflow.com/a/163968/1104941

下面的内容对你有用吗?

这是admin.py文件的内容:

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

试着在你所有的模型字段中加上 null=True, blank=True

通常情况下,如果某一行数据不符合模型的要求,Django 管理后台会默默地失败(也就是说在列表中不会显示任何记录)。

8

我同意Stefano的看法,确实需要加上null=True, blank=True。不过,我觉得你只需要把它加到Organization模型里的org_name字段上。这样就可以解决问题了。之所以需要这样做,是因为你用inspectdb从旧数据库生成了模型。而且,可能数据库里的organization表存储了一个空字符串。所以,加上这些设置后,管理员就可以看到一个可以留空的字段/列了。

此外,你还可以尝试在一些情况下使用回调函数,这样就不需要像上面那样去修改模型定义。

撰写回答