django 表单操作

django带有一个form库,django.forms。将要处理的HTML的<Form>定义一个form类,放到一个文件中:forms.py文件中。

from django import forms

class Login(forms.Form):
        username = forms.CharField(widget=forms.TextInput(attrs={'class':'form-control','placeholder':'请输入用户名'}))
        email = forms.EmailField()
        ip = forms.GenericIPAddressField(error_messages={'required':('IP不能为空'),'invalid':('格式错误')})

每一个字段默认都是必填,要使email成为可选项,需要指定required=False;forms把每个字段的显示逻辑都分离到一部组件(widget)中,可以使用widget=forms.Textarea替换掉默认组件。message = forms.CharField(widget=forms.Textarea)

在视图中使用Form对象

from app04 import forms
import json

def index(request):
    ret = {'data':None,'error':''}
    obj = forms.Login()
    ret['data']=obj
    if request.method == 'POST':
        checkForm = forms.Login(request.POST)       #绑定数据到表单
        checkresult = checkForm.is_valid()
        if checkresult:
            print(checkForm.cleaned_data)
       print(checkForm.cleaned_data['username'])
else: errorsObj = checkForm.errors
#       firstErrorMsg = checkForm.errors.as_data() firstErrorMsg
= checkForm.errors.as_json() ErrorMsg = json.loads(firstErrorMsg).values() EndMsg = list(ErrorMsg)[0][0]['message'] ret['error'] = EndMsg ret['data'] = checkForm #出现错误后,不会清空原来的输入 return render_to_response('login_form.html',ret) return render_to_response('login_form.html',ret)

对于绑定的表单可以使用

  is_valid() 方法来执行验证并返回一个表示数据是否合法的布尔值

  cleaned_data 包含表单中定义的合法字段

  errors属性可以获得错误信息的一个字典,这个我暂时没有测试出来,有点问题。

  as_data()方法返回一个字典,它映射字段到原始的ValidationError实例,当输入错误的IP格式时,

    {'ip': [ValidationError(['格式错误'])]}

  as_json()返回JSON序列化后的错误,当输入错误的IP格式时返回

    {"ip": [{"message": "u683cu5f0fu9519u8bef", "code": "invalid"}]}

login_form.html中:

<form action="/app04/index/" method="POST">
                用户名:{{ data.username }}
                邮箱:{{ data.email }}
                IP: {{data.ip}}

        <!--    {{ form.as_table }}    -->
                <input type="submit" value="提交">
                <div>
                        {{ error }}
                </div>
</form>

  表单渲染选项

  {{ form.as_table }}以表格的形式将它们渲染在<tr>标签中

  {{ form.as_p }}以表格的形式将它们渲染在<p>标签中

  {{ form.as_ul }}以表格的形式将它们渲染在<li>标签中

  需要自己提供<table>或<ul>元素

效果

原文地址:https://www.cnblogs.com/homle/p/8620791.html