Доступ к информации из формы POST в django 1.6

#django #python-2.7 #django-models #django-forms

#django #python-2.7 #django-модели #django-формы

Вопрос:

У меня есть несколько форм, одна из которых создается как ModelForm, а другая — простая форма. Оба они используются в запросе.POST и для получения информации из них я использую разные методы:

Для формы ModelForm я делаю это:

 form = ApplicantForm(request.POST)
if form.is_valid():
    applicant = form.save(commit=False)
    applicant.confirmation_code = '999999'
    applicant.save()
  

Для простой формы я использую:

 form = ConfirmationCode(request.POST)
code = request.POST['confirmation_code']
confirmation_id=request.POST['confirmation_id']
  

Как вы можете видеть, для доступа к информации в первой форме я использую «form.save.ЛЮБОЕ ПОЛЕ», а для второго я использую «запрос.POST[‘ANYFIELD’] . Возможно ли получить доступ к информации в первой форме с помощью запроса.Методы POST, даже если они не были сохранены? Что лучше?

Комментарии:

1. Форма во втором примере вообще ничего не делает и совершенно бессмысленна, поскольку вы получаете доступ к данным POST напрямую — вы могли бы сделать это без формы.

2. Теперь, когда вы это сказали, я могу заметить, что это совершенно верно!!! Спасибо, что указали на это… Теперь, если мне понадобится получить доступ к информации в переменной form, нужно ли мне сначала сохранить ее? Возможно ли сохранить простой экземпляр формы? (переменная form — ЭТО экземпляр простой формы form, верно?)

Ответ №1:

Вы можете попробовать это для modelform:

 form = ApplicantForm(request.POST)
if form.is_valid():
   app_code= form.cleaned_data['confirmation_code'] #assuming confirmation_code is a field in your modelform
   .....
  

Комментарии:

1. Вы имеете в виду, что мне не нужно сохранять экземпляр формы для доступа к его информации? Почему это лучше, чем использование form.save().confirmation_code ?

2. вам не нужно сохранять ее для доступа к данным. вы можете получить доступ к данным, позвонив form.cleaned_data['field_name']

Ответ №2:

Вы, кажется, немного смущены тем, что сохранение делает в modelform. При вызове вы form.save() создаете новый экземпляр модели, с которой связана форма, и (если вы не укажете commit=False ) сохраняете эти данные в базе данных. Поскольку у вас есть экземпляр, вы можете использовать любой из обычных методов экземпляра модели и шаблонов доступа.

Если вы хотите использовать форму без связанной модели, вы не можете вызвать save — потому что нечего сохранять и нет модели для создания экземпляра — но вы должны получить доступ к данным через form.cleaned_data словарь после вызова form.is_valid() . Это связано с тем, что данные cleaned_data были проверены в соответствии с правилами в форме и при необходимости преобразованы в соответствующие типы: например, если у вас было вызвано целочисленное поле в вашей форме my_number , request.POST['my_number'] будет строкой, подобной "3" , но form.cleaned_data['my_number'] будет фактическим целым числом, 3 .

Комментарии:

1. Спасибо за четкое и развернутое объяснение!! Мне это действительно было нужно.