Django中的表单

发布于 2019-11-23 18:09:56   阅读量 122  点赞 0  

一、初识表单

  • 表单模型都继承自forms.FORM

  • Django中的表单本质上也是一个模型,其可用来:   1. 传递给DTL引擎,渲染出前端中的表单;   2. 通过表单模型验证所提交的数据是否合法。

    当然,没有表单模型也可以提交数据到后台进行交互;但是使用表单模型可以很方便地进行数据的验证。   表单模型与其他的模型不同,表单模型不会生成表,其内的属性只是用来过滤,不会映射到数据库生成字段。

  • 表单模型的字段名需与前端页面中表单组件的name属性值相同,才能正确地进行对应验证。

  • 需在模板的表单元素中添加一个组件,用以传递csrf验证信息。
    <input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}"/>
    

二、表单的使用

1.渲染表单

 1. 在视图函数中实例化定义好的表单类,将表单对象作为一个参数传递给html页面。  2. 在html模板中,使用{{ form.as_table }}来渲染表单.

  • 在模板中的表单对象不一样命名为form,该对象名由视图函数传递参数时指定;  
  • 需在模板中手动添加<form></fomr>标签,DTL渲染时不会添加;  
  • 在模板中渲染出来的表单不含有提交按钮,需要手动添加。  
  • 除了as_table外,还有as_pas_ul 等渲染方法;在使用对应渲染方法时需手动添加外层标签,如as_table需添加 table 标签。

 使用这种方法渲染出来的表单可定制性差,故一般手写前端的form表单,再将表单数据提交到后台,使用表单模型进行验证。  

2.数据验证

 直接将request对象POST属性中的数据(含有请求中通过post方法提交的数据)传入定义的表单类,生成表单对象;再对该表单对象调用is_vaild()方法进行验证,若成功,则调用表单对象的cleaned_data.get("name")方法提取所需数据,其中name值为前端表单组件指定的name属性值。

   

三、一般的使用流程

  1. 新建forms.py文件,定义表单模型,其中每个模型均继承自django.forms.Form

    # forms.py
    from django import forms
    class MessageBoardForm(forms.Form):
     title = forms.CharField(max_length=3,label='标题',min_length=2,error_messages={"min_length":'标题字符段不符合要求!'})
     content = forms.CharField(widget=forms.Textarea,label='内容')
     email = forms.EmailField(label='邮箱')
     reply = forms.BooleanField(required=False,label='回复')
    

  2. 在视图函数中,根据请求方式进行相应操作。若为GET方法请求当前url,则返回表单页面;若为POST方法请求,则此时为表单提交,则将提交上来的数据进行处理。

    # views.py
    class IndexView(View):
     def get(self,request):
         form = MessageBoardForm()
         return render(request,'index.html',{'form':form})
    
     def post(self,request):
         form = MessageBoardForm(request.POST)
         if form.is_valid():
             title = form.cleaned_data.get('title')
             content = form.cleaned_data.get('content')
             email = form.cleaned_data.get('email')
             reply = form.cleaned_data.get('reply')
             return HttpResponse('success')
         else:
             print(form.errors)
             return HttpResponse('fail')
    

  3. 定义模板,对视图函数传过来的表单对象进行渲染。

    <form action="" method="post">
     <table>
         {{ form.as_table }}
         <tr>
             <td></td>
             <td><input type="submit" value="提交"></td>
         </tr>
     </table>
    </form>
    


Last Modified : 2020-03-09 18:45:48