将应用名称添加到Django管理员更改表单中的ContentType字段

时间:2018-07-02 08:53:22

标签: python django django-models django-admin

我有一个用于电子邮件模板的Django管理网站。 这些电子邮件模板具有ContentType ForeignKey字段。此字段显示在管理员更改视图中。

型号:(不显示相关代码)

class EmailTemplate(models.Model):
    name = models.CharField(verbose_name=_('Name'), max_length=200, unique=True)
    content_type = models.ForeignKey(ContentType, verbose_name=_('Content Type'))

admin.py :(不显示非相关代码)

class EmailTemplateAdmin(admin.ModelAdmin):
    form = EmailTemplateForm
    list_display = ('name',)
    fieldsets = (
        (None, {
            'classes': ('monospace',),
            'fields': ('name','content_type',)
        }),
    )

我现在想自定义字段“ content_type”。现在,它只是显示ContentType,我想向其中添加相应的“ app_label”(我们有很多应用程序,但遗憾的是,某些模型存在于多个应用程序中(因此名称显示了两次,无法对其进行区分)。相当旧的代码库,并且无法将所有模型重命名为应用程序之间唯一的。

简而言之:

如何更改我的content_types字段显示如下:“ [Content_type] [Content_type.app_label]

1 个答案:

答案 0 :(得分:0)

您可以为EmailTemplateForm添加自己的自定义字段

class EmailTemplateAdmin(admin.ModelAdmin):
    form = EmailTemplateForm
    list_display = ('name',)
    fieldsets = (
        (None, {
            'classes': ('monospace',),
            'fields': ('name','content_type',)
        }),
    )

class EmailTemplateForm(forms.ModelForm):
    content_type = CustomModelChoiceField(queryset=ContentType.objects.all()) 
    class Meta:
          model = EmailTemplate
...

class CustomModelChoiceField(forms.ModelChoiceField):
     def label_from_instance(self, obj):
         # maybe you can find better solution to get app_label
         return "%s %s" % (obj, obj.__class__._meta.app_label)