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()])