Django中clean_data有什么用

Ase*_*eem 6 django cleaned-data

Django 说如果form.is_valid()Trueform.cleaned_data是存储所有经过验证的字段的地方。但我对使用该cleaned_data功能感到困惑。

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

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

if form1.is_valid():
    form1.save()
Run Code Online (Sandbox Code Playgroud)

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

form2=form1.save(commit=False);
Run Code Online (Sandbox Code Playgroud)

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

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

小智 16

TL; 博士

form.cleaned_data 返回经过验证的表单输入字段及其值的字典,其中字符串主键作为对象返回。

form.data 以字符串格式(即非对象)返回未验证表单输入字段及其值的字典。

代码示例

在我的forms.py我有两个领域:

class Loginform(forms.Form):
    username=forms.CharField()
    password=forms.CharField(widget=forms.PasswordInput)
Run Code Online (Sandbox Code Playgroud)

在我的views.py

def login_page(request):
    form=Loginform(request.POST or None)
    if form.is_valid():
        print(form.cleaned_data)
Run Code Online (Sandbox Code Playgroud)

上面的代码打印以下输出:

{'username': 'xyz', 'password': 'shinchan'}
Run Code Online (Sandbox Code Playgroud)

如果改为views.py包含:

def login_page(request):
    form=Loginform(request.POST or None)
    if form.is_valid():
        print(form)
Run Code Online (Sandbox Code Playgroud)

上面的代码打印以下内容:

 <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>
Run Code Online (Sandbox Code Playgroud)


Rar*_*ack 12

有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()
Run Code Online (Sandbox Code Playgroud)

例如ModelForm

if form.is_valid():
    form.save()
Run Code Online (Sandbox Code Playgroud)

注意:如果表单通过is_valid()阶段,则没有任何未经验证的数据。

  • 如果表单无效,`form1.save()` 或 `form2=form1.save(commit=False)` 将不起作用。这也意味着这些函数仅将有效输入保存到数据库。使用 python manage.py shell 来尝试一下 (2认同)