Посмотрите на ответ Рассела на похожий вопрос в группе пользователей django в начале этой недели.
Цитирование ответа *:
Формыи представления решают различные проблемы.
представление решает проблему «как мне обработать этот запрос и преобразовать его в ответ?».Форма решает проблему «Как преобразовать данные POST в этом запросе в объект модели (или изменение в объект модели)?».
Очень грубо, представление выполняет следующее:
- View получает запрос
- View определяет, является ли это GET или POST
- Если это POST, View запрашивает форму, чтобы превратить сообщение визменение модели
- Форма возвращает успех или неудачу
- Просмотр реагирует на успех или неудачу формы.
- Просмотр возвращает ответ.
Функциональные возможности формы являются полным подмножеством функциональных возможностей представления - и по этой причине это полностью взаимозаменяемый внутренний компонент.
Теперь в простых ситуациях для представления можно угадать всезначения по умолчанию для формы - все, что нужно знать, это то, что вы имеете дело с моделью Foo, и она может создать стандартную Foo ModelForm.Однако, если у вас есть более сложные требования к форме, вам понадобится настраиваемая форма.
Мы могли бы реализовать это, предоставив все опции ModelForm в классе View;но чтобы сохранить все в чистоте, мы сохранили изолированную ModelForm и предоставили представлению способ указать, какой класс Form он будет использовать.
Итак, чтобы охватить ваш случай использования исключения полей, вы определяетеModelForm, которая исключает поля, а затем сообщите CreateView форму, которую вы хотите использовать:
class CampaignForm(forms.ModelForm):
class Meta:
model = Campaign
exclude = ('user', 'name', 'content_inlined')
class CreateCampaignView(CreateView):
form_class = CampaignForm
template_name = "forms/create.html"
Я предполагаю, что когда вы говорите «исправить значения для поля»,Вы имеете в виду установку значений user, name и content_inlined перед сохранением нового экземпляра Campaign;чтобы сделать это, вам нужно добавить какой-то дополнительный код в логику обработки формы:
class CreateCampaignView(CreateView):
form_class = CampaignForm
template_name = "forms/create.html"
def form_valid(self, form):
form.instance.user = ... (something meaningful.. e.g., self.request.user)
return super(CreateCampaignView, self).form_valid(form)
Это переопределяет поведение по умолчанию, когда форма действительна, и устанавливает дополнительныйценности.Реализация super () для form_valid () затем сохранит экземпляр.
Для записи это также можно сделать, переопределив метод save () в ModelForm - однако, если вы это сделаете, выпотерять объект запроса, который вам понадобится, если вы пытаетесь установить значения экземпляров, которые чувствительны к запросу.
* исходный набор ответов self.object.user
вместо form.instance.user
.Это дает AttributeError
, поэтому я изменил его выше.