Django: поле только для чтения - PullRequest
9 голосов
/ 14 апреля 2010

Как разрешить заполнение полей пользователем во время создания объекта (страница «Добавить»), а затем сделать доступным только для чтения при доступе на странице «Изменить»?

Ответы [ 4 ]

10 голосов
/ 03 июня 2011

Самое простое решение, которое я нашел, было переопределить функцию get_readonly_fields в ModelAdmin:

class TestAdmin(admin.ModelAdmin):    
    def get_readonly_fields(self, request, obj=None):
        '''
        Override to make certain fields readonly if this is a change request
        '''
        if obj is not None:
            return self.readonly_fields + ('title',)
        return self.readonly_fields
admin.site.register(TestModel, TestAdmin)

Объект будет none для страницы добавления и экземпляр вашей модели для страницы изменений. Изменить: Обратите внимание, что это было проверено на Django == 1,2

3 голосов
/ 15 апреля 2010

В вашем вопросе есть две вещи для ответа.

1.Поля формы только для чтения

Не существует, как в Django, но вы можете реализовать его самостоятельно, и этот пост может помочь.

2.Другая форма для добавления / изменения

Я полагаю, вы ищете решение в контексте сайта администратора (в противном случае просто используйте 2 разные формы в своих представлениях).

Вы можете в конечном итоге переопределить add_view или change_view в вашем ModelAdmin и используйте другую форму в одном из представлений, но я боюсь, что вы получите ужасную загрузку дублированного кода.

Другое решение, которое я могу придуматьof, является формой, которая изменит свои поля при создании экземпляра, когда передается параметр instance (то есть: регистр edit ).Предполагая, что у вас есть класс ReadOnlyField, который даст вам что-то вроде:

class MyModelAdminForm(forms.ModelForm):
    class Meta:
        model = Stuff

    def __init__(self, *args, **kwargs):
        super(MyModelAdminForm, self).__init__(*args, **kwargs)
        if kwargs.get('instance') is not None:
            self.fields['title'] = ReadOnlyField()

Здесь поле title в модели Stuff будет доступно только для чтения на странице измененийАдминистратор сайта, но редактируемый в форме создания.

Надеюсь, это поможет.

2 голосов
/ 14 апреля 2010

Вы можете отредактировать метод сохранения этой модели, чтобы справиться с таким требованием. Например, вы можете проверить, содержит ли поле какое-либо значение, если оно есть, игнорировать новое значение.

1 голос
/ 14 апреля 2010

Один из вариантов - переопределить или заменить шаблон change_form для этой конкретной модели.

...