Django Form¶
作者: | 王蒙 |
---|---|
标签: | Django, Web Frameworks, Python |
简介: | 本节介绍 Django 如何处理 form(表单)。 |
Contents
解决办法¶
什么是表单¶
表单用于接收用户输入参数。
表单是 html5 中的 form 元素。
html5 form 元素中 method 属性表示向服务器发送的 HTTP 方法,一般都是 POST ,也可能是 GET。
表单会向服务器传送用字典表示的数据,Django 可以方便得解析 form 获得用户输入。
Django 如何处理表单¶
定义 form, 和定义 Model 类似,给出表单的字段,就定义了表单。与 Model 中的字段不同, form 字段的 widget 会设置该字段在前端的展现形式。
在模板中 render form。 form.as_p, form.as_table 等等方法可以把 form 转成 html 语句(进而显示在前端),一般会把 form.as_p, form.as_table 等等语句直接写到模板中。
Form 解析用户输入数据:
- 首先调用构造器,生成 form, 比如 EmailForm(request.POST)
- 然后调用 is_valid 验证输入是否合法,调用 .clean_data(dict 类型数据) 得到用户输入。
- 如果是 ModelForm,可能会调用 save 保存结果。
from django import forms
# define a form is forms.py.
class EmailPostForm(forms.Form):
name = forms.CharField(max_length=25)
email = forms.EmailField()
to = forms.EmailField()
comments = forms.CharField(required=False,
widget=forms.Textarea)
# handle form in views.
def post_share(request, post_id):
# Retrieve post by id
post = get_object_or_404(Post, id=post_id, status='published')
sent = False
if request.method == 'POST':
# Form was submitted
form = EmailPostForm(request.POST)
if form.is_valid():
# Form fields passed validation
cd = form.cleaned_data
post_url = request.build_absolute_uri(post.get_absolute_url())
subject = '{} ({}) recommends you reading "{}"'.format(cd['name'], cd['email'], post.title)
message = 'Read "{}" at {}\n\n{}\'s comments: {}'.format(post.title, post_url, cd['name'], cd['comments'])
send_mail(subject, message, 'admin@myblog.com', [cd['to']])
sent = True
else:
form = EmailPostForm()
return render(request, 'blog/post/share.html', {'post': post,
'form': form,
'sent': sent})
参考文献¶
- Django by Example(本节的代码摘自 Django By Example)
- working with form: https://docs.djangoproject.com/en/dev/topics/forms/
- Form and field validation: https://docs.djangoproject.com/en/dev/ref/forms/validation/
- Creating forms from models: https://docs.djangoproject.com/en/1.11/topics/forms/modelforms/
- Formset: https://docs.djangoproject.com/en/1.11/topics/forms/formsets/