【问题标题】:Django Admin: when displaying an object, display a URL that contains one of the fieldsDjango Admin:显示对象时,显示包含其中一个字段的 URL
【发布时间】:2013-07-04 10:27:03
【问题描述】:

这是我的许多“Treatment”模型(TreatmentA, TreatmentB 等)的抽象基类:

class TreatmentBase(models.Model):
    URL_PREFIX = '' # child classes define this string

    code = shared.models.common.RandomCharField(length=6) 

    class Meta:
        abstract = True

每个 Treatment 实例都有一个 URL,当用户访问该 URL 时,会将他们带到特定于该处理的页面。我希望能够在 Django Admin 中创建一个处理,并立即获取此 URL,以便我可以将其发送给用户。可以在 TreatmentBase 上使用以下方法创建此 URL:

    def get_url(self):
        return '{}/{}/'.format(self.URL_PREFIX, self.code)

但是,我不知道如何让这个 URL 显示在 Django Admin 中。我可以想到以下解决方案:

(1) 自定义code 字段的显示,使其成为可点击的URL。 问题:我不知道该怎么做。

(2) 将get_url 方法添加到ModelAdmin.list_display问题:这意味着我必须为BaseTreatment 的每个子模型定义一个单独的list_display,并且我必须明确列出模型的所有字段,这意味着我必须每次修改模型时都更新它,违反 DRY。

(3) 像这样添加一个额外的字段:

    url = models.URLField(default = get_url)

问题:get_url 是一个实例方法(因为它需要引用self.code 字段),根据我对docs about the default argument 的阅读,它必须是一个不带参数的简单可调用对象。

有什么方法可以完成这个看似简单的任务?

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    您可以使用选项 2(添加到管理显示),但将其添加到 readonly_fields 可以在模型更改时缓解您对 DRY 的担忧。

    如果您覆盖设置 URL 属性的 save 方法,选项 3(额外字段)也可以工作。您要么想在管理员中将该字段设置为只读,要么仅在 save 方法中设置值(如果当前为 None)。

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 2011-08-16
      • 2016-09-11
      • 2018-06-17
      • 2021-04-28
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多