1、Form表单
引言:请看下面的例子。
有这么一个form表单:
<form action="" method="post">
主机:<input type="text" name="host"/>
<br/>
端口:<input type="text" name="port"/>
<br/>
邮箱:<input type="text" name="email"/>
<br/>
电话:<input type="text" name="mobile"/>
<br/>
<input type="submit" value="提交"/>
</form>
数据提交到后台时,我们在视图函数中一般这么处理:
def handle_form(request):
if request.method == 'POST':
host = request.POST.get('host')
port = request.POST.get('port')
mail = request.POST.get('mail')
mobile = request.POST.get('mobile')
# 判断数据是否为空, 提示用户哪个错误
# ...
# 判断格式是否正确,提示用户哪个错误。
# ...
# 数据库校验
# filter(host=host,port=port,mail=mail,mobile=mobile)
# create(host=host,port=port,mail=mail,mobile=mobile)
# 无法保留上一次提交的数据
#
return render(request, 'user_list.html')
else:
return render(request, 'user_list.html')
使用django的form可以把以上步骤都节约。
2、Django的form的作用
先定义form类
from django import formsclass UserInfoForm(forms.Form):
email = forms.EmailField(required=False)
host = forms.CharField()
port = forms.CharField()
mobile = forms.CharField()
1)生成html标签
<form action="{% url 'django-form' %}" method="post">
主机:{{ form.host }}
<br/>
端口:{{ form.port }}
<br/>
邮箱:{{ form.email }}
<br/>
手机:{{ form.mobile }}
<br/>
<input type="submit" value="提交"/>
</form>
还可以使用form.as_table,form.as_p,form.as_ul来自动生成form标签手动绘制form:
<div class="fieldWrapper">
{{ form.host.errors }}
<label for="{{ form.host.id_for_label }}">Email subject:</label>
{{ form.subject }}
</div>或者:
<div class="fieldWrapper">
{{ form.host.errors }}
{{ form.host.label_tag }}
{{ form.host }}
</div>或者,循环读取form中的字段来显示form:
{% for field in form %}
<div class="fieldWrapper">
{{ field.errors }}
{{ field.label_tag }} {{ field }}
{% if field.help_text %}
<p class="help">{{ field.help_text|safe }}</p>
{% endif %}
</div>
{% endfor %}2) 用来做用户提交的验证
form.is_valid()方法返回True 或False,表明用户输入的数据是否合法,是否通过校验。
如用户输入的数据不合法,错误信息将会放在form.errors这个字典中。key是字段名,value是字段的错误描述。
合法数据将会放在cleaned_data中。cleaned_data是一个字典。通常获取form中数据的方法是先判断一个form数据是否合法,如果合法则去cleaned_data中取值:
if form.is_valid():
subject = form.cleaned_data['subject']
3、 form表单定制化
1)自定义报错内容
在form里有一个参数:error_messages,可以通过此参数定制报错内容。比如:
email = forms.EmailField(required=True,error_messages={'required':u'邮箱不能为空'})
2)给form表单添加一个属性,通过widget的attr属性来添加额外的属性。比如:
mobile = forms.CharField(error_messages={'required':u'手机不能为空'},
widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'})
#这里默认是TextInput,标签
)
3)自定义校验规则。通过form的validators来指定自定义的校验规则。比如:
def mobile_validate(value):
mobile_re = re.compile(r'^(13[0-9]|15[012356789]|17[678]|18[0-9]|14[57])[0-9]{8}$') #正则匹配
if not mobile_re.match(value):
raise ValidationError('手机号码格式错误')
mobile = forms.CharField(validators=[mobile_validate,],#应用咱们自己定义的规则
error_messages={'required':u'手机不能为空'},
widget=forms.TextInput(attrs={'class':'form-control','placeholder':u'手机号码'})
)
5)修改默认的控件,比如生成select标签
user_type_choice = (
(0, u'普通用户'),+
(1, u'高级用户'),)
user_type = forms.IntegerField(widget=forms.widgets.Select(choices=user_type_choice,attrs={'class':'form-control'}))
6)生成form表单初始化数据,使用initial属性,比如:
name = forms.CharField(initial='Your name')、
4、ModelForm
如果不想写form中的那些字段定义,可以直接从Model的字段中定义ModelForm来生成form
基础用法是通过class Meta来指定model和想在form中使用的字段,比如:
class AuthorForm(ModelForm):
class Meta:
model = Author
fields = ['name', 'title', 'birth_date']
modelform的save方法可以直接将form中的数据保存到model中。