Django ModelAdmin не работает с методом пользовательского поля

Я пытаюсь написать пользовательский метод, чтобы изменить стандартный просмотр поля в ModelAdmin, как описано здесь: https://docs.djangoproject.com/en/3.2/ref/contrib/admin/

Так что это должно работать:

@admin.register(Contract)
class ContractDataAdmin(admin.ModelAdmin):
    list_display = ("name", "status", "date_end")
    list_filter = ('name','status', "date_end", "headquarters_access_list")
    fields = ("name", "status", "date_start", "date_end", "manager_list", "buyer", "get_document_list_field", "headquarters_access_list")

    @admin.display(empty_value='???')
    def get_document_list_field(self, obj):
        return "\n".join([c.name for c in obj.document_list.all()])

Где находится модель:

class Contract(models.Model):
    class Meta:
        verbose_name = _('Contract')
        verbose_name_plural = _('Contracts')

    name = models.CharField(max_length=255,
                                help_text=_('Contract name'),
                                verbose_name=_('contract name'))
    status = models.CharField(max_length=255, 
                                default=ContractStatus.OPEN,
                                choices=ContractStatus.choices(),
                                help_text=_('Status'),
                                verbose_name=_('Status'))
    date_start = models.DateField(editable=True,
                                help_text=_('Start date'),
                                verbose_name=_('Start date'))
    date_end = models.DateField(editable=True,
                                help_text=_('End date'),
                                verbose_name=_('End date'))
    manager_list = models.ManyToManyField(User, 
                                blank=True,
                                help_text=_('Manager list'),
                                verbose_name=_('Manager list'))
    buyer = models.OneToOneField(CompanyData,  # Committente
                                related_name="buyer",
                                on_delete=models.RESTRICT, 
                                default=None,
                                null=True,
                                auto_created=False,
                                help_text=_('Buyer'),
                                verbose_name=_('buyer'))
    headquarters_access_list = models.ManyToManyField(Headquarters, 
                                blank=True,
                                help_text=_('Headquarters access list'),
                                verbose_name=_('Headquarters access list'))
    contractor_list = models.ManyToManyField(CompanyData, 
                                blank=True,
                                help_text=_('Contractors list'),
                                verbose_name=_('Contractors list'))
    staff_list = models.ManyToManyField(UserData,
                                blank=True,
                                help_text=_('Staff list'),
                                verbose_name=_('Staff list'))
    vehicle_list = models.ManyToManyField(VehicleData,
                                blank=True,
                                help_text=_('Vehicle list'),
                                verbose_name=_('Vehicle list'))
    document_list = models.ManyToManyField(Document,
                                blank=True,
                                help_text=_('Document list'),
                                verbose_name=_('Document list'))

При переходе на страницу модели (/admin/common/contract/1/change/) я получаю следующую ошибку:

Где проблема? get_document_list_field является эквивалентом view_birth_date в официальной документации:

from django.contrib import admin

class AuthorAdmin(admin.ModelAdmin):
    fields = ('name', 'title', 'view_birth_date')

    @admin.display(empty_value='???')
    def view_birth_date(self, obj):
        return obj.birth_date

Какой возможный способ сделать то же самое? Мне нужно настроить вид определенного поля при изменении.

Чтобы иметь пользовательское "поле", которое является результатом метода, отображаемого в вашей форме, вам нужно передать его в readonly_fields

@admin.register(Contract)
class ContractDataAdmin(admin.ModelAdmin):
    list_display = ("name", "status", "date_end")
    list_filter = ('name','status', "date_end", "headquarters_access_list")
    fields = ("name", "status", "date_start", "date_end", "manager_list", "buyer", "get_document_list_field", "headquarters_access_list")
    readonly_fields = ("get_document_list_field", )

    @admin.display(empty_value='???')
    def get_document_list_field(self, obj):
        return "\n".join([c.name for c in obj.document_list.all()])
Вернуться на верх