修改TabularInline中元素的表示

时间:2012-04-30 21:20:43

标签: python django django-admin

对于这个特定的管理页面,我想将“当前值”(在红色圆圈中概述)转换为返回此特定对象的管理页面的链接。

但是我无法找到去做这个改变的地方。我知道我需要以某种方式覆盖这个 显示但我无法理解。

我需要覆盖什么来做我想做的事?

current admin interface

管理模型定义:

class FirmwareConfigElementsChoiceInline(admin.TabularInline):
    model = FirmwareConfigElements
    extra = 1

class FirmwareConfigAdmin(admin.ModelAdmin):
    save_as = True
    list_display = ('name', 'description')
    inlines = [FirmwareConfigElementsChoiceInline]

使用Filip的帮助我已经达到了这个目的:

class FirmwareConfigElementsForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        klass = FirmwareConfigElementsForm
        super(klass, self).__init__(*args, **kwargs)

        if self.instance.type == 'incfw':
            value = self.instance.value
            url = '#'  # TODO: get the URL for the value
            hyperlink = '<a href="%s">%s</a>' % (url, value)
            label = self.fields['type'].label.replace(value, hyperlink)
            self.fields['type'].label = label

但在上面的代码中,self.fields['type'].label的内容为Type,而不是我期待的Include another FW Config - BASE:IBM-HS22/HS22V

我在调试器中对它进行了探讨,但我无法弄清楚如何找到我想要更改的特定标签。

2 个答案:

答案 0 :(得分:1)

内联管理模型可以使用template property来提供自定义模板。从那里,您需要修改代码以添加网址。

答案 1 :(得分:1)

您需要为ModelForm模型提供自定义FirmwareConfigElements,您将其设置为FirmwareConfigElementsChoiceInline.form类属性的值。

在这里,您需要覆盖ModelForm.__init__()实例方法,以便在表单绑定时为要覆盖的字段分配新标签:

class FirmwareConfigElementsForm(models.ModelForm):
    def __init__(self, *args, **kwargs):
        klass = FirmwareConfigElementsForm
        super(klass, self).__init__(*args, **kwargs)

        if form.is_bound and 'value' in self.data:
            value = self.data['value']
            url = ''  # TODO: get the URL for the value
            hyperlink = '<a href="%s">%s</a>' % (url, value)
            label = self.fields['type'].label.replace(value, hyperlink)
            self.fields['type'].label = label


class FirmwareConfigElementsChoiceInline(admin.TabularInline):
    model = FirmwareConfigElements
    extra = 1
    form = FirmwareConfigElementsForm

现在,如果您希望标签随着用户更改表单数据而动态更改,那么它会变得更加丑陋,您将不得不诉诸referencing JavaScript media并在运行中执行上述操作。