我有一个大学和另一个联系模式:
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") ???
在管理界面上编辑University contact时,我希望能够从University中“拉”
'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/
我自己也没试过。