What is the use of cleaned_data in Django

时间:2018-12-03 13:20:19

标签: django cleaned-data

Django says if form.is_valid() is True. form.cleaned_data is where all validated fields are stored. But I am confused about using the cleaned_data function.

form.cleaned_data['f1'] -- cleaned data request.POST.get('f1') -- un-validated data

I have a model form in Django.

if form1.is_valid():
    form1.save()

Does this save cleaned_data to the model or does it save unvalidated data.

form2=form1.save(commit=False);

Does form2 contain form1's cleaned_data or unvalidated data.

Apart from converting any date to python datetime object, is there a good example of benefit of using cleaned_data vs unvalidated data. Thanks

2 个答案:

答案 0 :(得分:7)

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>

答案 1 :(得分:3)

有两种情况:使用基本的 Form (forms.Form)和 ModelForm (forms.ModelForm)。

如果您使用的是ModelForm,则无需使用cleaned_data字典,因为当您进行form.save()时,它已经被匹配并且保存了干净的数据。但是,如果您使用的是基本Form,则必须手动将每个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()阶段通过,则没有任何未验证的数据。