天天看点

Django框架 Form组件 实例

1.实例1:

#app01/views.py:

import re,json
from django import forms
from django.core.exceptions import ValidationError

def mobile_validate(value):
    mobile_re=re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$')
    if not mobile_re.match(value):
        raise ValidationError('手机号码格式错误')

class PublishForm(forms.Form):#必须继承forms.Form
    user_type_choice=(
        (0,u'普通用户'),
        (1,u'高级用户'),
    )
    user_type=forms.IntegerField(
        widget=forms.widgets.Select(
            choices=user_type_choice,
            attrs={
                'class':"form-control"
            }
        )
    )
    title=forms.CharField(
    #字段应和对应的<input>的name属性的值相同
        max_length=20,#最大长度
        min_length=5,#最小长度
        required=True,#不能为空
        error_messages={
            'required':u'标题不能为空',
            'min_length':u'标题最少为5个字符',
            'max_length':u'标题最多为20个字符'
        },
        widget=forms.TextInput(
            attrs={
                'class':"form-control",
                'placeholder':u'标题5-20个字符'
            }
        )
    )
    memo=forms.CharField(
        required=False,
        max_length=256,
        widget=forms.widgets.Textarea(
            attrs={
                'class':"form-control no-radius",
                'placeholder':u'详细描述',
                'rows':3
            }
        )
    )
    phone=forms.CharField(
        validators=[mobile_validate,],
        error_messages={
            'required':u'手机不能为空'
        },
        widget=forms.TextInput(
            attrs={
                'class':"form-control",
                'placeholder':u'手机号码'
            }
        )
    )
    email=forms.EmailField(
        required=False,
        error_messages={
            'required':u'邮箱不能为空',
            'invalid':u'邮箱格式错误'
        },
        widget=forms.TextInput(
            attrs={
                'class':"form-control",
                'placeholder':u'邮箱'
            }
        )
    )

def publish(request):
    ret={'status':False,'data':'','error':'','summary':''}
    if request.method=='POST':
        request_form=PublishForm(request.POST)#进行验证
        #对于<form>表单/Ajax这2种提交方式,都可以进行验证
        if request_form.is_valid():#如果验证成功(格式正确)
            #request_dict=request_form.clean()
            request_dict=request_form.cleaned_data
            #验证成功的数据,是个dict
            print(request_dict["email"])#打印email信息
            ret['status']=True
        else:
            error_msg=request_form.errors.as_json()
            #error_msg=request_form.errors
            #错误信息,类似1个dict
            #t_error_msg=request_form.errors.title
            #title字段的错误信息,类似1个list
            #t_error_msg.0表示第1条错误信息
            ret['error']=json.loads(error_msg)
    return HttpResponse(json.dumps(ret))
           

2.实例2:

#app01/views.py:

from django.shortcuts import render,HttpResponse,redirect
from django import forms

class UserForm(forms.Form):
    user=forms.fields.CharField(
    #每个字段对应1个验证规则,每个验证是1个正则表达式
        max_length=18,
        min_length=6,
        required=True
        error_messages={
            "required":"用户名不能为空",#为空时的错误提示
            "max_length":"用户名最长为18个字符",#过长时的错误提示
            "min_length":"用户名最短为6个字符"#过短时的错误提示
        }
    )
    pwd=forms.fields.CharField(
        required=True,
        min_length=12
        error_messages={
            "required":"密码不能为空",
            "min_length":"密码最短为6个字符"
        }
    )
    age=forms.fields.IntegerField(
        required=True
        error_messages={
            "required":"年龄不能为空",
            "invalid":"年龄格式错误"#格式不合法时的错误提示
        }
    )
    email=forms.fields.EmailField(
        required=True
        min_length=8,
        error_messages={
            "required":"邮箱不能为空",
            "min_length":"邮箱最短为8个字符",
            "invalid":"邮箱格式错误"
        }
    )

def user(req):
    user_list=models.UserInfo.objects.all()
    return render(req,"/user.html")

def add(req):
    if req.method=="POST":
        obj=UserForm(req.POST)
        if obj.is_valid():
            models.UserInfo.objects.create(**obj.cleaned_data)
            #将obj.cleaned_data直接作为字典传入,创建记录
            #注意应和数据库中的字段名相同
            return redirect("/user.html")
        else:
            return render(req,"/add.html",{"obj":obj})
    elif req.method="GET":
        info={"user":"请输入用户名","pwd":"请输入密码","age":"请输入年龄","email":"请输入邮箱"}
        obj=UserForm(**info)
        return render(req,"/add.html",{"obj":obj})

def edit(req,nid):
    if req.method=="GET":
	    data=models.UserInfo.objects.filter(id=nid).first()
	    obj=UserForm({"user":data.user,"email":data.email})
	    #传入的值将作为<input>的默认值
	    return render(req,"/user.html",{"obj":obj,"nid":nid})
    elif req.method=="POST":
        obj=UserForm(obj.POST)
        if obj.is_valid():
            models.UserInfo.objects.filter(id=nid).update(**obj.cleaned_data)
            return redirect("/user.html")
        else:
            return render(req,"/user.html",{"obj":obj,"nid":nid})
           
<!--user.html:-->

<body>
	<a href="/add.html">添加</a>
	<ul>
	    {% for row in user_list %}
	        <li>{{row.id}}-{{row.user}}-{{row.age}}-{{row.email}}-<a href="/edit.html-{{row.id}}">编辑</a></li>
        {% endfor %}
    <ul>
</body>
           
<!--add.html:-->

<body>
	<form action="/add.html.html">
	    <p>{{obj.user}}{{obj.errors.user.0}}</p><!--第1条错误信息-->
	    <!--{{obj.user}}将创建1个用于输入user的<input>
	    <!--<p><input type="text" name="user">{{obj.errors.user}}</p>-->
	    <!--上1条的效果见下图1,下1条的效果见下图2(仅是效果,并非本例实际结果)-->
	    <p>{{obj.pwd}}{{obj.errors.pwd.0}}</p>
        <p>{{obj.age}}{{obj.errors.age.0}}</p>
        <p>{{obj.email}}{{obj.errors.email.0}}</p>
        <input type="submit" value="提交">
    </form>
</body>
           
Django框架 Form组件 实例
Django框架 Form组件 实例
<!--edit.html:-->

<body>
    <form action="/edit.html-{{nid}}" method="POST">
        {% csrf_token %}
        <p>{{obj.user}}{{obj.errors.user.0}}</p>
        <p>{{obj.email}}{{obj.errors.email.0}}</p>
        <input type="submit" value="提交">
    </form>
</body>
           

3.实例3:

#views.py:

from django.shortcuts import render,HttpResponse,redirect
from django import forms
import json

class AjaxForm(forms.Form):
    price=forms.fields.IntegerField()
    user_id=forms.fields.IntegerField(
        widget=forms.widgets.Select(choices=[(1,"aaa"),(2,"abc"),(3,"asd")])
    )

def ajax(req):
    if req.method=="GET":
        obj=AjaxForm()
        return render(req,"ajax.html",{"obj":obj})
    elif req.method=="POST":
        ret={"status":"N","message":None}
        obj=AjaxForm(req.POST)
        if obj.is_valid():#是在这1句进行的验证
			print(obj.cleaned_data)
			#return redirect("http://www.baidu.com")
			  #由于采用Ajax进行提交,这1句无效
			ret["status"]="Y"
			return HttpResponse(json.dumps(ret))
		else:
            print(obj.errors)
            ret["message"]=obj.errors
			return HttpResponse(json.dumps(ret))

#说明:
obj.errors的数据类型是ErrorDict,不是Python的基本数据类型
但是ErrorDict类继承dict类,因此二者被序列化的方式相同
故虽然ErrorDict不是基本数据类型,但也能进行json.dumps()
           
<!--ajax.html:-->

<body>
    <form id="fm" method="POST" action="/ajax.html">
        {% csrf_token %}
        {{ obj.as_p }}
        <input type="button" value="Ajax提交" id="btn">
    </form>
    <script src="/static/jquery-3.1.1.js"></script>
    <script>
        $(function() {
            $("#btn").click(function() {
                $.ajax({
                    url:"/ajax.html",
                    type:"POST",
                    data:$("#fm").serialize(),
                    dataType:"JSON",
                    success:function(arg) {
                        //arg必须包含:验证结果,错误信息
                        if (arg.status=="Y") {
                            window.location.href="http://www.baidu.com"
                              //这1句用于跳转
                        }
                    }
                })
            })
        })
    </script>
</body>