Добавление имени приложения в поле ContentType в форме смены администратора Django - PullRequest
0 голосов
/ 02 июля 2018

У меня есть сайт администратора 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 голосов
/ 02 июля 2018

Вы можете добавить свое собственное поле для вашего 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)
...