【问题标题】:What is the use of cleaned_data in DjangoDjango中cleaned_data有什么用
【发布时间】:2019-05-04 19:20:07
【问题描述】:

Django 说如果form.is_valid()Trueform.cleaned_data 是所有已验证字段的存储位置。但我对使用cleaned_data 函数感到困惑。

form.cleaned_data['f1'] -- 清理数据 request.POST.get('f1') -- 未经验证的数据

我在 Django 中有一个模型表单。

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

这会将cleaned_data保存到模型还是保存未验证的数据。

form2=form1.save(commit=False);

form2 是否包含 form1 的 clean_data 或未验证数据。

除了将任何日期转换为 python 日期时间对象之外,还有一个很好的例子来说明使用 clean_data 与未验证数据的好处。 谢谢

【问题讨论】:

  • 为什么会保存未清理的数据?无论如何,如果表单有效,则没有任何未清理的数据。
  • 所以 form1.cleaned_data[' '] 应该只在检查单个表单字段时使用?如果 form.is_valid() ==True,则无需访问单独的字段cleaned_data。 form1['field1'] == form1.cleaned_data['field1'] ?

标签: django cleaned-data


【解决方案1】:

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>

【讨论】:

    【解决方案2】:

    有两种情况:使用基本的Form(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() 阶段通过,则没有任何未经验证的数据。

    【讨论】:

    • 如果表单无效,form1.save()form2=form1.save(commit=False) 将不起作用。这也意味着这些函数仅将有效输入保存到 DB。使用python manage.py shell 试试看
    • 是的,没错。这就是为什么将它们放在 is_valid() 子句中的原因。 Django 试图让一切都没有错误,如果没有它,你应该自己验证输入数据。
    猜你喜欢
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 2010-10-12
    相关资源
    最近更新 更多