表单用于让用户提交数据或上传文件,也用于用户编辑已有数据。Django的表单Form类的作用是把用户输入的数据转化成Python对象格式,便于后续操作(比如存储、修改)。
自定义表单类
Django提供了两种自定义表单的方式:继承
Form
类和ModelForm
类。前者你需要自定义表单中的字段,后者可以根据Django模型自动生成表单
from django import forms
from django.forms import ModelForm
from .models import MyModel
# 定义一个普通的表单
class SimpleForm(forms.Form):
your_name = forms.CharField(label='Your Name', max_length=100)
email = forms.EmailField(label='Email')
# 定义一个与模型关联的表单
class MyModelForm(ModelForm):
class Meta:
model = MyModel
fields = '__all__' # 这里可以指定字段,例如 ['field1', 'field2']
Django模型里用
verbose_name
来给字段添加一个别名或描述, 而表单用的是label
。自定义的表单类一般位于app目录下的
forms.py
,这样方便集中管理表单。如果要使用上述表单,我们可以在视图里views.py
里把它们像模型一样import
进来直接使用。
自定义字段错误信息
每个字段你可以设置其是否为必需,最大长度和最小长度。你还可以针对每个字段自定义验证错误信息
from django import forms
class LoginForm(forms.Form):
username = forms.CharField(
required=True,
max_length=20,
min_length=6,
error_messages={
'required': '用户名不能为空',
'max_length': '用户名长度不得超过20个字符',
'min_length': '用户名长度不得少于6个字符',
}
)
password = forms.CharField(
required=True,
max_length=20,
min_length=6,
error_messages={
'required': '密码不能为空',
'max_length': '密码长度不得超过20个字符',
'min_length': '密码长度不得少于6个字符',
}
)
继承
ModelForm
类的表单, 我们可以在Meta
选项下widget中来自定义错误信息
from django.forms import ModelForm, Textarea
from myapp.models import Author
class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ('name', 'title', 'birth_date')
widgets = {
'name': Textarea(attrs={'cols': 80, 'rows': 20}), # 关键是这一行
}
labels = {
'name': 'Author',
}
help_texts = {
'name': 'Some useful help text.',
}
error_messages = {
'name': {
'max_length': "This writer's name is too long.",
},
}
自定义表单输入widget
Django表单的每个字段你都可以选择你喜欢的输入
widget
,比如多选,复选框。你还可以定义每个widget的css属性。如果你不指定,Django会使用默认的widget。比如下面这段代码定义了表单姓名字段的输入控件为Textarea,还指定了其样式css。
from django import forms
class ContactForm(forms.Form):
name = forms.CharField(
max_length=255,
widget=forms.Textarea(
attrs={'class': 'custom'},
),
)
设置widget可以使表单大大美化,方便用户选择输入。比如下面案例里对年份使用了
SelectDateWidget
,对课程使用RadioSelect
, 颜色则使用了复选框CheckboxSelectMultiple
。
from django import forms
BIRTH_YEAR_CHOICES = ('1980', '1981', '1982')
COLORS_CHOICES = (
('blue', 'Blue'),
('green', 'Green'),
('black', 'Black'),
)
class SimpleForm(forms.Form):
birth_year = forms.DateField(
widget=forms.SelectDateWidget(years=list(BIRTH_YEAR_CHOICES))
)
favorite_colors = forms.MultipleChoiceField(
required=False,
widget=forms.CheckboxSelectMultiple,
choices=list(COLORS_CHOICES),
)