Django admin 列表显示 + 外键 = 空的更改列表
我在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
表存储了一个空字符串。所以,加上这些设置后,管理员就可以看到一个可以留空的字段/列了。
此外,你还可以尝试在一些情况下使用回调函数,这样就不需要像上面那样去修改模型定义。