#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. Спасибо за четкое и развернутое объяснение!! Мне это действительно было нужно.