编写表单类

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

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

当我们将上面的表单渲染成真正的HTML元素,其内容如下:

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

一定要注意,它不包含<form>标签本身以及提交按钮

视图函数

  1. from django.shortcuts import render
  2. from django.http import HttpResponseRedirect
  3. from .forms import MyForm
  4. # Create your views here.
  5. def get_name(request):
  6. if request.method == 'POST':
  7. form = MyForm(request.POST)
  8. if form.is_valid():
  9. return HttpResponseRedirect('/thanks/')
  10. else:
  11. form = MyForm()
  12. return render(request, 'name.html', {'form', form})

要点是:

  • 对于GET方法请求页面时,返回空的表单,让用户可以填入数据;
  • 对于POST方法,接收表单数据,并验证;
  • 如果数据合法,按照正常业务逻辑继续执行下去;
  • 如果不合法,返回一个包含先前数据的表单给前端页面,方便用户修改。

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

widgets

说明

表单字段负责验证输入并直接在模板中使用。而Widget负责渲染网页上HTML表单的输入元素和提取提交的原始数据。widget是字段的一个内在属性,用于定义字段在浏览器的页面里以何种HTML元素展现。

指定类型

每个字段都有一个默认的widget类型

  1. comment = forms.CharField(widget=forms.Textarea)

这将使用一个Textarea Widget来展现表单的评论字段,而不是默认的TextInput Widget。

参数

指定字段的内容,属性,如下设置了SelectDateWidget的years 属性

  1. BIRTH_YEAR_CHOICES = ('1980', '1981', '1982')
  2. birth_year = forms.DateField(widget=forms.SelectDateWidget(years=BIRTH_YEAR_CHOICES))

CSS样式

创建Widget时使用 Widget.attrs参数来更改字段CSS样式