在django中,可以使用form来进行表单验证,甚至自动生成样式(虽然不怎么好看)
下面是一个典型的form类。
class MemoForm(forms.Form):
#隐藏控件
mid = forms.CharField(widget=forms.HiddenInput(), required=False)
#普通的input控件
title = forms.CharField(label=u'标题', error_messages= \
{'required': u'标题不能为空'}, required=True)
#textarea控件
body = forms.CharField(label=u'内容', error_messages= \
{'required': u'内容不能为空'}, widget=forms.Textarea( \
attrs={'rows': 10, 'cols': 40}))
#时间控件
timestamp = forms.DateTimeField(label=u"时间", error_messages= \
{'required': u'时间不能为空', 'invalid': u'请输入正确的时间'}, \
initial=django.utils.timezone.now(),\
input_formats=["%Y/%m/%d %H:%M:%S"], widget=\
forms.DateTimeInput(attrs={'placeholder': '时间'}, format="%Y/%m/%d %H:%M:%S"))
依例,可以看到form中控件的属性:
label 设置标题
error_messages 设置自定义错误
initial 设置初始值
widget 设置field的实际控件
attrs
定义widget样式
要注意DateTimeField控件的格式化,使用input_formats 和 format 来进行格式化。不能在template中用 timestamp|date:"Y-m-d H:i" 来格式化。否则会在验证的时候出错。
定义完这个form后,就应该写响应代码了。
代码:
def edit(request, mid):
temp_memo = Memo.objects.get(id=int(mid))
if temp_memo.author != request.user:
return HttpResponseForbidden()
if request.method == "POST":
form = MemoForm(request.POST)
if form.is_valid(): # 所有验证都通过
temp_memo.title = form.cleaned_data['title']
temp_memo.body = form.cleaned_data['body']
temp_memo.body.replace("\r\n", "\n").replace("\n", "<br>")
temp_memo.timestamp = form.cleaned_data['timestamp']
temp_memo.author = request.user
temp_memo.save()
return HttpResponseRedirect('/memo/list')
else:
form = MemoForm(initial={'body': temp_memo.body.replace("<br>", "\r\n"), \
'timestamp': temp_memo.timestamp, \
"mid": temp_memo.id, \
"title": temp_memo.title})
return render(request, 'memo/memo_form.html', {'form': form})
在这个view中,
1)使用form.is_valid() 验证是否和表单中相关属性相符
2)用initial 来确定它的初始值。
在form中,可以使用系统自带的函数来生成相关的控件,有下面几个函数:
{{ form.xx.errors }} 显示form验证返回的错误,验证在form类中定义。
{{form.xx.label_tag}} 生成一个<label/>标签,显示的是view中设置的label
{{ form.xx }} 生成内容控件,比如一个textarea控件
{{form.xx.label}} 只生成form的label,不生成<label>标签
{{form.xx.value}} 显示字段的值
甚至还可以使用:
{{ form.as_table }} will render them as table cells wrapped in <tr> tags {{ form.as_p }} will render them wrapped in <p> tags {{ form.as_ul }} will render them wrapped in <li> tags
来一鼓作气的生成一个很呆萌的form。
当然,我们也可以完全手工或者半手工构造这个form 的templates。建议保留form.XXX.errors这个标签。
<input id="id_title" style='width:100%;margin-bottom:5px;' placeholder="标题"
name="title" type="text"
value="{{form.title.value|default_if_none:''}}" />
{{ form.title.errors }}