python Django : join view on the admin interface

标签 python django django-models django-admin

我有一个大学模型和另一个联系人模型:

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_displayreadonly_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/

相关文章:

Python-Django [SSL : WRONG_VERSION_NUMBER] Error

python - Django - 获取外键(相关)对象的列表

postgresql - 选择不同的。最适合减少等待时间的技术

Python规则引擎: Durable Rules JSON Rule Format to Support NOT operator

python - 尝试使用 python boto 库插入 float 时出现 DynamoDBNumberError

django - 如何验证特定表单的字段并忽略必填字段?

python - Django 查询扩展的 USER 表

python - TypeError : int() argument must be a string or a number, 不是 'Model Instance'

python - 根据外键对django对象进行分组

python - 为 django 模型中的每个字段添加置信度值