Django Admin - Заполните поле и установите только для чтения - PullRequest
0 голосов
/ 12 ноября 2018

Я хочу установить поле (текущий пользователь) в модели автоматически, когда объект создается или обновляется, и сделать его доступным только для чтения, поэтому пользователь не может его изменить:

Для предварительного заполненияfield:

@admin.register(Model)
class ModelAdmin(admin.ModelAdmin):
    list_display = ('field_1', 'user')

    def get_form(self, request, obj=None, **kwargs):
        form = super(ModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['user'].initial = request.user
        return form

Это работает, но когда я затем хочу сделать поле доступным только для чтения, используя:

readonly_fields=('user', )

приложение вылетело с ошибкой:

KeyError at /admin/api/model/add/
'user'

Кто-нибудь может мне помочь и объяснить, как я могу достичь своей цели с помощью администратора django?

спасибо!

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Работа, которую я нашел, была такой:

form.base_fields['user'].disabled = True

Вы также можете добавить текст справки:

form.base_fields['user'].help_text = "some help text"

Итак, в вашем коде это будет:

    def get_form(self, request, obj=None, **kwargs):
        form = super(ModelAdmin, self).get_form(request, obj, **kwargs)
        form.base_fields['user'].initial = request.user
        form.base_fields['user'].disabled = True
        form.base_fields['user'].help_text = "This field is not editable"
        return form

Тогда вам не нужно использовать readonly_fields

0 голосов
/ 12 ноября 2018

Администратор предоставляет метод с именем save_model, который можно использовать для добавления текущего пользователя к объекту при его сохранении;

@admin.register(Model)
class ModelAdmin(admin.ModelAdmin):

    def save_model(self, request, obj, form, change):
        obj.user = request.user
        super().save_model(request, obj, form, change)
...