【问题标题】:Adding the app name to a ContentType field in the Django admin change form将应用程序名称添加到 Django 管理员更改表单中的 ContentType 字段
【发布时间】:2018-12-10 10:54:05
【问题描述】:

我有一个用于电子邮件模板的 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]

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    您可以为 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)
    

    【讨论】:

    • 部分工作,它只是在每个实际的 content_type 后面显示“content_type”,它应该显示“app_name1”、“app_name2”等。
    • 哦,没关系,修好了。我不得不使用 obj.app_label 而不是 obj.__class__._meta.app_label。
    最近更新 更多