Какая польза от 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>
Другие вопросы по тегам