Отображение значения GenericForeignKey только для чтения в админке Django - PullRequest
0 голосов
/ 29 августа 2018

У меня есть модель Django с общим отношением к User или Organization. Модель выглядит так:

class Project(models.Model):
    # ...
    client_type = models.ForeignKey(
        'contenttypes.ContentType',
        on_delete=models.SET_NULL,
        blank=True,
        null=True,
        limit_choices_to=(
            models.Q(app_label='users', model='user') |
            models.Q(app_label='organizations', model='organization')
        )
    )
    client_id = models.PositiveIntegerField(blank=True, null=True)
    client = GenericForeignKey('client_type', 'client_id')
    # ...

Я могу отобразить имя любого клиента этого проекта в списке администраторов проекта, используя:

@admin.register(models.Project)
class ProjectAdmin(admin.ModelAdmin):
    list_display = (
        '__str__',
        'client',
    )

Однако я не могу найти простой способ отобразить имя клиента на странице фактических изменений проекта. Я попробовал очевидное:

fields = (
    'name',
    'client',
)

Но это приводит к ошибке о том, что client не является допустимым именем поля. Я прочитал Использование родовых отношений как встроенный раздел документации Django, но их пример кажется ... задом наперед?

Я просто хочу отобразить имя того, кто является клиентом, его не нужно редактировать. Есть предложения?

1 Ответ

0 голосов
/ 29 августа 2018

list_display автоматически обрабатывает все поля только для чтения. Но для отображения поля GenericForeignKey на странице изменений необходимо явно сделать его доступным только для чтения:

read_only_fields = ('client', )

Ошибка, которую вы получаете, по общему признанию, весьма смущает, она также несколько раз сбила меня с толку.

...