25)django-form使用
目录
1)django form作用
2)django form使用
一:django form 作用
django form有两个作用:一是用户输入数据验证;二是生成html
1)用户输入数据验证,比如用户输入的用户名密码,不能为空,邮件格式验证等。如果自己写正则写很复杂。可以使用django form实现验证
2)通过django form生成html表单
二:django form使用
1)form常用方法
#表单使用
obj=FM(request.POST) #把POST信息提交给表单验证 r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面 print(obj.errors)#验证错误的信息obj.errors里面(列表ul) print(obj.errors.as_json()) 返回是字典
2) form使用简单示例
#创建 from django import forms class FM(forms.Form) from django import forms class FM(forms.Form): user=forms.CharField() pwd=forms.CharField() email=forms.EmailField() #假如用户提交了很多数据过来,我怎么知道是那一个是我们需要验证的。 这里的user和form表单里的name值是一致的。即定义的字段和form表单里的name属性的值必须要一致 <form action="/fm/" method="post"> {% csrf_token %} <input type="text" name="user"> <input type="password" name="pwd"> <input type="text" name="email"> <input type="submit" value="提交"> </form> #表单使用 obj=FM(request.POST) #把POST信息提交给表单验证 r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面 print(obj.errors)#验证错误的信息obj.errors里面(列表ul) print(obj.errors.as_json()) 返回是字典 示例: def fm(request): if request.method=="GET": return render(request,'fm.html') if request.method=="POST": #获取用户所有数据 #每条数据请求的验证 #成功:获取所有正确的信息 #失败:显示错误信息 obj=FM(request.POST) #把POST信息提交给表单验证 r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False print(r1) if r1: print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面 else: print(obj.errors)#验证错误的信息obj.errors里面 return redirect("/index/") 结果: False <ul class="errorlist"><li>user<ul class="errorlist"><li>This field is required.</li></ul></li><li>pwd<ul class="errorlist"><li>This field is required.</li></ul></li><li>email<ul class="errorlist"><li>This field is required.</li></ul></li></ul> True {'user': 'root', 'pwd': '`12', 'email': '123@126.com'} {"user": [{"message": "This field is required.", "code": "required"}], "pwd": [{"message": "This field is required.", "code": "required"}], "email": [{"message": "This field is required.", "code": "required"}]}
3)上面错误都是英文,能不能定制。
#2)上面错误都是英文,能不能定制。 from django import forms class FM(forms.Form): #我只关心我关心的 user=forms.CharField(error_messages={'required':'用户名不能为空'}) pwd=forms.CharField(max_length=12, min_length=6, error_messages={'min_length':'密码长度不能小于6','max_length':'密码长度不能大于12','required':'密码不能为空'}) email=forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'}) #假如用户提交了很多数据过来,我怎么知道是那一个是我们需要验证的。这里的user和form表单里的name值是一致的。
4)错误信息传递给模板
def fm(request): if request.method=="GET": return render(request,'fm.html') if request.method=="POST": #获取用户所有数据 #每条数据请求的验证 #成功:获取所有正确的信息 #失败:显示错误信息 obj=FM(request.POST) #把POST信息提交给表单验证 r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False print(r1) if r1: print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面 else: #obj.errors 继承了ErrirDict,是个字典obj.errors.user 会出错。正确写法:obj.errors["user"] print(obj.errors)#验证错误的信息obj.errors里面 # print(obj.errors["user"][0])#拿到第一个错误信息 #把错误信息传递到模板 return render(request,'fm.html',{"obj":obj}) return render(request,'fm.html') fm.html <form action="/fm/" method="post"> {% csrf_token %} <p><input type="text" name="user"> {{ obj.errors.user.0 }} </p> <p> <input type="password" name="pwd"> {{ obj.errors.pwd.0 }} </p> <p><input type="text" name="email"> {{ obj.errors.email.0 }}</p> <input type="submit" value="提交"> </form>
5)上面错误信息显示了,但是原来输入的值没有了。上面不仅显示错误信息,还可以输出标签
<form action="/fm/" method="post"> {% csrf_token %} <p>{{ obj.user }} {{ obj.errors.user.0 }} </p> <p> {{ obj.pwd }} {{ obj.errors.pwd.0 }} </p> <p>{{ obj.email }} {{ obj.errors.email.0 }}</p> <input type="submit" value="提交"> </form> 但是上面没有显示输入框,因为第一次请求是GET,没有返回对象 所以GET模式要创建对象,不需要传递参数,但是变量名和POST一样。 def fm(request): if request.method=="GET": obj=FM() return render(request,'fm.html',{"obj":obj}) if request.method=="POST": #获取用户所有数据 #每条数据请求的验证 #成功:获取所有正确的信息 #失败:显示错误信息 obj=FM(request.POST) #把POST信息提交给表单验证 r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False print(r1) if r1: print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面 else: #obj.errors 继承了ErrirDict,是个字典obj.errors.user 会出错。正确写法:obj.errors["user"] print(obj.errors)#验证错误的信息obj.errors里面 # print(obj.errors["user"][0])#拿到第一个错误信息 #把错误信息传递到模板 return render(request,'fm.html',{"obj":obj}) return render(request,'fm.html') #注意浏览器可能会自己加些东西显示。
6)上面如果值如果正确。那就可以入库了
#5)上面如果值如果正确。那就可以入库了 models.UserInfo.objects.create(**obj.cleaned_data) def fm(request): if request.method=="GET": obj=FM() return render(request,'fm.html',{"obj":obj}) if request.method=="POST": #获取用户所有数据 #每条数据请求的验证 #成功:获取所有正确的信息 #失败:显示错误信息 obj=FM(request.POST) #把POST信息提交给表单验证 r1=obj.is_valid() #让他去验证,并返回值,有没有验证成功。成功返回True,不成功返回False print(r1) if r1: print(obj.cleaned_data)#验证成功的信息obj.cleaned_data里面 models.UserInfo.objects.create(**obj.cleaned_data) return redirect("/index") else: #obj.errors 继承了ErrirDict,是个字典obj.errors.user 会出错。正确写法:obj.errors["user"] print(obj.errors)#验证错误的信息obj.errors里面 # print(obj.errors["user"][0])#拿到第一个错误信息 #把错误信息传递到模板 return render(request,'fm.html',{"obj":obj})
7)快速生成ul,p,table的form 页面
1)验证用户请求 2)生成HTML(保留上一次输入的数据) 上面还支持另外种方式,但是还是建议使用上面,定制方便。 <body> <form action="/fm/" method="post"> {% csrf_token %} {{ obj.as_p }} #p标签方式显示 <input type="submit" value="提交"> </form> <form action="/fm/" method="post"> {% csrf_token %} {{ obj.as_ul }} #显示列表 <input type="submit" value="提交"> </form> <form action="/fm/" method="post"> {% csrf_token %} {{ obj.as_table }} #显示表格 <input type="submit" value="提交"> </form> </body>
8)怎么设置样式
#form字段 XXXField()字段本身只做验证 设置样式是inputext用插件widgets user=forms.CharField(error_messages={'required':'用户名不能为空'},widget=widgets.Textarea(attrs={"class":"c1"})) from django import forms from django.forms import widgets,fields class FM(forms.Form): #我只关心我关心的 user=fields.CharField(error_messages={'required':'用户名不能为空'},widget=widgets.Textarea(attrs={"class":"c1"})) pwd=fields.CharField(max_length=12, min_length=6, error_messages={'min_length':'密码长度不能小于6','max_length':'密码长度不能大于12','required':'密码不能为空'}) email=forms.EmailField(error_messages={'required':'邮箱不能为空','invalid':'邮箱格式错误'}) #假如用户提交了很多数据过来,我怎么知道是那一个是我们需要验证的。这里的user和form表单里的name值是一致的。 fields包括了所有的XXField,推荐使用这种写法。 widgets包括了所有的插件