【问题标题】:Python Django: join view on the admin interfacePython Django:在管理界面上加入视图
【发布时间】:2013-10-20 06:12:04
【问题描述】:

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

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 - 来自另一个表。

我希望能够按地区等快速对联系人进行排序。

【问题讨论】:

  • 亚利桑那州,该死的! :)

标签: python django django-models django-admin


【解决方案1】:

显示很简单——定义一个返回模型或管理类相关数据的方法,然后使用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',)

或者,这里有一个代码 sn-p 声称可以解决这个问题: http://djangosnippets.org/snippets/2887/

我自己没有测试过。

【讨论】:

  • 谢谢!您对list_filter 中标准相关字段语法的最后评论实际上做到了!我不知道我可以通过连接每个表中的一列来获得这样的过滤器。
  • 如果我没记错的话,这是在 1.3 版中添加的。我个人有点惊讶list_displayreadonly_fields 不支持它;邮件列表上的一个讨论将其归咎于找出相关领域名称的困难,但列表过滤器的使用也必须解决这个问题。我可能忽略了一些复杂性,因为讨论它并判断它不可行的人是核心开发人员,不太可能忽略一些明显的东西。 groups.google.com/forum/#!topic/django-developers/eQSEv74bQh8
猜你喜欢
  • 2019-10-08
  • 1970-01-01
  • 2011-01-27
  • 2013-12-05
  • 2016-05-08
  • 2015-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多