django form使用
- 2019 年 11 月 21 日
- 筆記
在django中,可以使用form来进行表单验证,甚至自动生成样式(虽然不怎么好看)
1 生成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" 来格式化。否则会在验证的时候出错。
2 使用这个Form
定义完这个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("rn", "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>", "rn"), '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 来确定它的初始值。
3 设定它的templates
3.1 简单设置
在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。
3.2 自定义
当然,我们也可以完全手工或者半手工构造这个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 }}