我有一个大学模型和另一个联系人模型:
class University(models.Model):
abbrev = models.CharField(max_length=20, unique=True) # example "ASU" for Alabama State University
name = models.CharField(max_length=512, unique=True)
city = models.CharField(max_length=512)
state = models.CharField(max_length=2, choices=STATE_CHOICES) # abbreviation
region = models.CharField(max_length=2, choices=REGION_CHOICES) # examples Mid West, South Coast, etc.
type = models.CharField(max_length=3, choices=TIPO_IES_CHOICES) # public, private, etc.
class UniversityContact(models.Model):
person ...
university ... # models.OneToOneField("University") ???
在管理界面上编辑 UniversityContact 时,我希望能够“拉”'abbrev'、'state'、'region'、
和 'type'
来自大学,与联系信息一起显示。那可能吗?它们不必在该上下文中可编辑。
我已经尝试将这些字段添加到 UniversityContact,全部作为“models.OneToOneField("University", related_name='...')
”,但它们最终都显示相同的值- abbrev
- 来自另一个表。
我希望能够按区域等快速对联系人进行排序。
最佳答案
显示很简单 - 在模型或管理类上定义一个返回相关数据的方法,然后使用 list_display
和/或 readonly_fields
中的方法。
对于排序,定义方法的 admin_order_field
属性。虽然 list_display
和 readonly_fields
不支持双下划线相关字段语法,但 admin_order_field
支持。所以像这样:
class UniversityContact(models.Model):
# as above, plus:
def abbrev(self):
return self.university.abbrev
abbrev.admin_order_field = 'university__abbrev'
如果您不希望方法名称的默认选择,您也可以选择设置 short_description
属性:
abbrev.short_description = 'abbreviation'
你没有问这个,但似乎值得知道 - list_filter
也支持标准的相关字段名称语法:
list_filter = ('university__region',)
或者,这里有一个代码片段声称可以解决它: http://djangosnippets.org/snippets/2887/
我自己还没有测试过。
关于 python Django : join view on the admin interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19330415/