django表单

Posted pfeiliu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了django表单相关的知识,希望对你有一定的参考价值。

 django中的表单继承自forms.Form:

主要功能有两个:页面渲染和表单数据验证

一般都是用来做表单验证

如果想从表单接收用户名数据,一般情况下,需要在html中手动编写一个如下的表单元素:

<form action="/your-name/" method="post">
    <label for="your_name">Your name: </label>
    <input id="your_name" type="text" name="your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>

使用django的表单

一.编写表单类

在Django中,Form类来自用生成上面的表单,不再需要手动在HTML中编写。

首先,在当前app内新建一个forms.py文件(这个套路是Django的惯用手法,就像views.pymodels.py等等),然后输入下面的内容:

from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label=Your name, max_length=100)

要点:

  • 提前导入forms模块
  • 所有的表单类都要继承forms.Form类
  • 每个表单字段都有自己的字段类型比如CharField,它们分别对应一种HTML语言中的<form>元素中的表单元素。这一点和Django模型系统的设计非常相似。
  • 例子中的label用于设置说明标签
  • max_length限制最大长度为100。它同时起到两个作用,一是在浏览器页面限制用户输入不可超过100个字符,二是在后端服务器验证用户输入的长度不可超过100。

(警告:由于浏览器页面是可以被篡改、伪造、禁用、跳过的,所有的HTML手段的数据验证只能防止意外不能防止恶意行为,是没有安全保证的,破坏分子完全可以跳过浏览器的防御手段伪造发送请求!所以,在服务器后端,必须将前端当做“裸机”来对待,再次进行完全彻底的数据验证和安全防护!)

每个Django表单的实例都有一个内置的is_valid()方法,用来验证接收的数据是否合法。如果所有数据都合法,那么该方法将返回True,并将所有的表单数据转存到它的一个叫做cleaned_data的属性中,该属性是以个字典类型数据。

上边的表单在前端会渲染成

<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100" required />

一定要注意,它不包含<form>标签本身以及提交按钮!!!为什么要这样?方便你自己控制表单动作和CSS,JS以及其它类似bootstrap框架的嵌入!

 

上边只是简单的一个例子,还有很多属性

在class NameForm(forms.Form)中,

    属性=forms.类型(参数)

类型和html标签类型的对应关系如下:

  1.类型:

    1.BooleanField:checkbox

    2.CharField:text

    3.ChoiceField:select

    4.EmailField:email

    5.URLField:url

    6.DateField:date

    7.IntegerField:number

  2.参数:

    1.required  默认为True,表示该控件不能为空

    2.label  控件前面的文本

    3.initial  控件的初始化值,相当于value

    4.widget  指定控件的小部件

    5.error_message  错误时候的文本提示

    6.disabled  为True时表示该空间会被禁用  

widget小部件:生成到网页上的控件  

  Textinput:type="text"

  Passwordinput:type="paddword"

  Numberinput:type="number"

  Emailinput:type="email"

  URLinput:type="url"

  Hiddeninput:type="hidden"

  Textarea:<textarea>

  

  CheckboxSelectMultipe:type="checkbox"

  Radioselect:type="radio"

  Select:<select>

  SelectMultipe:<select multipe>

 

widget小部件的使用:

  属性=forms.CharField(

    label="用户",

    widget=forms.小部件类型) 

  

  属性=forms.CharField(

    label="用户",

    widget=forms.小部件类型(

      attrs={

        "html属性值":"值"}))

二.视图函数

# views.py

from django.shortcuts import render
from django.http import HttpResponseRedirect

from .forms import NameForm

def get_name(request):
    # 如果form通过POST方法发送数据
    if request.method == POST:
        # 接受request.POST参数构造form类的实例
        form = NameForm(request.POST)
        # 验证数据是否合法
        if form.is_valid():
            # 处理form.cleaned_data中的数据
            # ...
            # 重定向到一个新的URL
            return HttpResponseRedirect(/thanks/)

    # 如果是通过GET方法请求数据,返回一个空的表单
    else:
        form = NameForm()

    return render(request, name.html, {form: form})

要点是:

  • 对于GET方法请求页面时,返回空的表单,让用户可以填入数据;
  • 对于POST方法,接收表单数据,并验证;
  • 如果数据合法,按照正常业务逻辑继续执行下去;
  • 如果不合法,返回一个包含先前数据的表单给前端页面,方便用户修改。
  • form.is_valid()为True,通过验证,为False,未通过验证
  • form.cleaned_data,获取表单数据,-字典

通过表单的is_bound属性可以获知一个表单已经绑定了数据,还是一个空表。

 

三.模板处理

xxx.html

<form action="/your-name/" method="post"> {% csrf_token %} {{ form }} <input type="submit" value="Submit" /> </form>

要点:

  • <form>...</form>标签要自己写;
  • 使用POST的方法时,必须添加{% csrf_token %}标签,用于处理csrf安全机制;
  • {{ form }}代表Django为你生成其它所有的form标签元素,也就是我们上面做的事情;
  • 提交按钮需要手动添加!

提示:默认情况下,Django支持HTML5的表单验证功能,比如邮箱地址验证、必填项目验证等等。

 

表单渲染格式:

不仅可以通过{{ form }}渲染模板,还有更多的方式:

  • {{ form.as_table }} 将表单渲染成一个表格元素,每个输入框作为一个<tr>标签
  • {{ form.as_p }} 将表单的每个输入框包裹在一个<p>标签内 tags
  • {{ form.as_ul }} 将表单渲染成一个列表元素,每个输入框作为一个<li>标签

注意:你要自己手动编写<table><ul>标签。

以上是关于django表单的主要内容,如果未能解决你的问题,请参考以下文章

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段

Django - 保存表单的位置

SpringBoot中表单提交报错“Content type ‘application/x-www-form-urlencoded;charset=UTF-8‘ not supported“(代码片段

如何将 django 表单字段属性插入 HTML 代码?

Django - AJAX - 如何提交多个表单?