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_display
的 ServerAdmin
类中删除 org
,我会得到:
我没有修改模板或覆盖任何ModelAdmin
方法。我使用 mysql(5.1.58) 作为 ubuntu 11.10 存储库附带的数据库。
如果我能解决这个问题,我会非常高兴。提前致谢。
【问题讨论】:
在models.py
我看到TlxServer
和admin.py
只是Server
。是不是打错字了?
您不需要定义自动字段。 Django 自动为每个表创建一个主键。
@jcollado:这是一个错字:P 它假设是“服务器”
@dan-klasson:我从旧数据库中获取模型。我跑了inspectdb
,得到了模型,我得到了IntegerField
作为主键,所以我把它们改成了AutoFiled
【参考方案1】:
我第二次 Stefano 关于要添加 null=True, blank=True
的事实。但是,我认为您只需要将其添加到 Organization
模型的 org_name
字段中。那应该可以通过。必须这样做,因为您已经运行 inspectdb
从旧数据库创建模型。数据库中的organization
表可能存储了一个空字符串。因此,添加上述内容将允许管理员显示一个空白字段/列。
此外,您还可以在不想像上面那样更改模型定义的情况下尝试使用callbacks。
【讨论】:
好的!与Organization
这样的另一个模型有类似的情况,它有一个ForeignKey
到User
。感谢您和 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 字段?