2013-07-04 76 views
0

这里的一个URL是对于很多“Treatment”模型的抽象基类(TreatmentA, TreatmentB等):Django管理:显示对象时,显示包含的字段

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

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

    class Meta: 
     abstract = True 

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

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

但是,我坚持着如何得到这个网址在Django管理显示。我可以想到以下解决方案:

(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的阅读,它只是必须是没有参数的简单可调用的。

任何方式来做这个看似简单的任务?

回答

0

您可以使用选项2(添加到管理显示),但将其添加到 readonly_fields,这可能会减少模型更改时的DRY问题。

如果您重写设置URL属性的方法save,则选项3(额外字段)也可以工作。您要么将该字段设置为只读的admin,要么仅设置save方法中的值(如果它当前为None)。

相关问题