使用form组件的大概步骤
概述
使用form组件的步骤
后端:
定义class 类
将实例化的对象传给前端
前端:
定义form表单
根据实际情况利用后端传过来的对象渲染标签
后端代码
################froms.py##################
#!/usr/bin/env python # -*- coding: utf-8 -*- from django import forms from django.forms import widgets #定义一个类 class RegForm(forms.Form): username=forms.CharField(max_length=32,min_length=8,error_messages={'required':'该字段不能为空'}) password=forms.CharField( widget=widgets.PasswordInput(),#修改成password类型 那么前端渲染出的input的 type='password' error_messages={'invalid':'格式错误,必须输入数字'} )#针对password不能直接用charfield 需要做成密文的 charfield默认渲染出来的input的type都是text类型 repeat_password=forms.CharField( widget=widgets.PasswordInput() #widget=widgets.Select() #还可以渲染别的标签 默认是input吧 #widget=widgets.PasswordInput(可以加参数) 例如:widget=widgets.PasswordInput(attrs={'egon':'123'})设置属性 #渲染后的结果为<input type="password" name="repeat_password" egon="123" required="" id="id_repeat_password"> #岂不是以后可以愉快的设置 默认值 以及class了 ) email=forms.EmailField()
##########views.py################### from django.shortcuts import render,HttpResponse,redirect from books.froms import RegForm def reg(request): if request.method=='POST': ''' print(request.POST) 打印结果: <QueryDict: {'csrfmiddlewaretoken': ['E4g1RpPoB0hgC7KcsQDdYFivAYTIGJ6jRGdlcxdQAeWJT8zA4E8Z3jMEul46k9ib'], 'username': ['VCB'], 'password': ['GFBH'], 'repeat_password': ['NFGN'], 'email': ['123@qq.com']}> ''' regForm=RegForm(request.POST)#将取到的数据放在空的对象里 就是一个有东西的对象了 if regForm.is_valid(): #然后对对象做校验 返回 True False ''' 如果成功取出数据 存入数据库 返回登录页面 取出数据: 虽然也可以用request.POST拿出数据但是 form组件有自己放的地方 regForm.cleaned_data 存放的是所有的干净的数据 print(regForm.cleaned_data) 打印结果: {'username': 'lalalal', 'password': 'dfsdfdsfdfds', 'repeat_password': 'dfdsfdfdsfdf', 'email': '123@qq.com'} ''' #然后就可以拿到每个字段 存入数据库 print(regForm.cleaned_data['username']) else: ''' 如果错误 拿到错误信息 展示在页面 错误信息存放处: regForm.errors 存放错误字段 以及对应的错误信息 ''' print(regForm.errors) ''' 例如:用户名不够长 错误信息其实是个封装后的字典 <ul class="errorlist"><li>username <ul class="errorlist"><li>Ensure this value has at least 8 characters (it has 2). </li></ul></li></ul> ''' #regForm.errors.get('username') 取出username对应的错误信息 return render(request,'reg.html',{'regForm':regForm}) #此时的regFrom是有数据的 包括错误信息 如果有的话 前端可以取到了 #用类来实例化对象 regForm=RegForm() #此时这个对象是空的 #然后把这个对象传到前端去 return render(request,'reg.html',{'regForm':regForm})
前端代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <p>欢迎新注册!!</p> <form action="/reg/" method="post"> {% csrf_token %} <p>姓名:{{ regForm.username }}</p><span>{{ regForm.errors.username.0 }}</span> #拿到username的错误信息 可能有多条 拿第一个 <p>密码:{{ regForm.password }}</p><span>{{ regForm.errors.password.0 }}</span> <p>确认密码:{{ regForm.repeat_password }}</p>{{ regForm.errors.repeat_password.0 }} <p>邮箱:{{ regForm.email }}</p><span>{{ regForm.errors.email.0 }}</span> <p><input type="submit" value="提交"></p> </form> </body> </html>
from类字段详解
from django import forms class RegisterForm(forms.Form): username = forms.CharField(max_length=100, error_messages={"min_length":"最短为5个字符","required":"该字段不能为空"}, ) password = forms.CharField(max_length=100, widget=widgets.PasswordInput(attrs={"placeholder":"password"}) ) telephone=forms.IntegerField( error_messages={ "invalid":"格式错误" } ) gender=forms.CharField( initial=2, widget=widgets.Select(choices=((1,'上海'),(2,'北京'),)) ) email = forms.EmailField() is_married = forms.BooleanField(required=False)
Widgets
每个表单字段都有一个对应的Widget
类,它对应一个HTML 表单Widget
,例如<input type="text">
。
在大部分情况下,字段都具有一个合理的默认Widget。例如,默认情况下,CharField
具有一个TextInput Widget
,它在HTML 中生成一个<input type="text">
。