Django Form

作者:王蒙
标签:Django, Web Frameworks, Python
简介:本节介绍 Django 如何处理 form(表单)。

目标读者

Python 开发,网站开发

预备知识

Django Model, Python

问题

  • 什么是表单
  • Django 如何处理表单

解决办法

什么是表单

表单用于接收用户输入参数。

表单是 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 解析用户输入数据:

  1. 首先调用构造器,生成 form, 比如 EmailForm(request.POST)
  2. 然后调用 is_valid 验证输入是否合法,调用 .clean_data(dict 类型数据) 得到用户输入。
  3. 如果是 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})

ModelForm

ModelFrom 直接使用关联的 model 中定义的字段作为 form 的输入字段。

   from .models import Comment
   # define modelform.
   class CommentForm(forms.ModelForm):
       class Meta:
       model = Comment
       fields = ('name', 'email', 'body')


Formset

多个 form 组成 formset。详细参见 Formsets