Какая польза от cleaned_data в Django
Джанго говорит, что если form.is_valid()
является True
, form.cleaned_data
где хранятся все проверенные поля. Но я запутался в использовании cleaned_data
функция.
form.cleaned_data['f1']
- очищенные данныеrequest.POST.get('f1')
- не подтвержденные данные
У меня есть модель формы в Джанго.
if form1.is_valid():
form1.save()
Сохраняет ли это cleaned_data в модели или сохраняет непроверенные данные.
form2=form1.save(commit=False);
Содержит ли form2 cleaned_data или непроверенные данные form1?
Помимо преобразования любой даты в объект python datetime, есть хороший пример преимущества использования cleaned_data по сравнению с непроверенными данными. Спасибо
1 ответ
Там 2 ситуации: использование базовых форм (forms.Form) и ModelForm (forms.ModelForm).
Если вы используете ModelForm, то вам не нужно играть с cleaned_data
словарь, потому что, когда вы делаете form.save()
оно уже сопоставлено и чистые данные сохранены. Но вы используете базовую форму, то вы должны вручную сопоставить каждый cleaned_data
в его место базы данных, а затем сохраните экземпляр в базе данных, а не в форме.
Например, базовая форма:
if form.is_valid():
ex = Example()
ex.username = form.cleaned_data['username']
ex.save()
Например ModelForm:
if form.is_valid():
form.save()
ПРИМЕЧАНИЕ: если форма переходит от is_valid()
этап, то нет никаких непроверенных данных.
TL;DR
form.cleaned_data
возвращает словарь проверенных полей ввода формы и их значений, где первичные ключи строк возвращаются как объекты.
form.data
возвращает словарь непроверенных полей ввода формы и их значений в строковом формате (то есть не объектов).
Пример по коду
В моем forms.py
У меня два поля:
class Loginform(forms.Form):
username=forms.CharField()
password=forms.CharField(widget=forms.PasswordInput)
и в моем views.py
:
def login_page(request):
form=Loginform(request.POST or None)
if form.is_valid():
print(form.cleaned_data)
Приведенный выше код выводит следующий результат:
{'username': 'xyz', 'password': 'shinchan'}
Если вместо этого views.py
содержит:
def login_page(request):
form=Loginform(request.POST or None)
if form.is_valid():
print(form)
Приведенный выше код печатает следующее:
<tr><th><label for="id_username">Username:</label></th><td><input type="text" name="username" value="xyz" required id="id_username"></td></tr>
<tr><th><label for="id_password">Password:</label></th><td><input type="password" name="password" required id="id_password"></td></tr>