0

这是我的许多“ 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. 问题:这意味着我必须list_display为 的每个子模型定义一个单独的模型BaseTreatment,并且我必须明确列出模型的所有字段,这意味着我每次修改模型时都必须更新它,这违反了 DRY。

(3) 添加一个额外的字段,如下所示:

    url = models.URLField(default = get_url)

问题:get_url是一个实例方法(因为它需要引用该self.code字段),并且从我阅读有关默认参数的文档来看,它必须是一个没有参数的简单可调用对象。

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

4

1 回答 1

0

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

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

于 2013-07-04T12:16:32.253 回答