Django: поле Только для чтения

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

9
задан Felix Kling 14 April 2010 в 17:45
поделиться

3 ответа

Там две вещи, которые нужно решить в вашем вопросе.

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

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

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

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

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

Еще одно решение, которое я могу придумать, - это форма, которая будет изменять свои поля при создании экземпляра, когда передается параметр экземпляра (то есть: случай 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 будет доступно только для чтения. на странице изменения админки, но редактируется в форме создания.

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

3
ответ дан 4 December 2019 в 13:00
поделиться

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

1
ответ дан 4 December 2019 в 13:00
поделиться

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

2
ответ дан 4 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: