• django_book学习笔记6表单


    一、第一个Form类
    1、介绍
    表单框架最主要的用法是,为每一个将要处理的HTML的`` <Form>`` 定义一个Form类。 在这个例子中,我们只有一个`` <Form>`` ,因此我们只需定义一个Form类。
    这个类可以存在于任何地方,甚至直接写在`` views.py`` 文件里也行,但是社区的惯例是把Form类都放到一个文件中:forms.py。在存放`` views.py`` 的目录中,
    创建这个文件,然后输入:
    from django import forms
    class ContactForm(forms.Form):
    subject = forms.CharField()
    email = forms.EmailField(required=False)
    message = forms.CharField()

    这看上去简单易懂,并且很像在模块中使用的语法。 表单中的每一个字段(域)作为Form类的属性,被展现成Field类。这里只用到CharField和EmailField类型。 每一个字段都默认是必填。要使email成为可选项,我们需要指定required=False。
    >>> from books.views import ContactForm
    >>> f=ContactForm()
    >>> print f
    <tr><th><label for="id_subject">Subject:</label></th><td><input type="text" name="subject" id="id_subject" /></td></tr>
    <tr><th><label for="id_email">Email:</label></th><td><input type="text" name="email" id="id_email" /></td></tr>
    <tr><th><label for="id_message">Message:</label></th><td><input type="text" name="message" id="id_message" /></td></tr>
    >>> print f.as_ul()
    <li><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></li>
    <li><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></li>
    <li><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></li>
    >>> print f.as_p()
    <p><label for="id_subject">Subject:</label> <input type="text" name="subject" id="id_subject" /></p>
    <p><label for="id_email">Email:</label> <input type="text" name="email" id="id_email" /></p>
    <p><label for="id_message">Message:</label> <input type="text" name="message" id="id_message" /></p>
    >>> print f['subject']
    <input type="text" name="subject" id="id_subject" />

    2、常用方法
    f.is_bound 是否绑定
    f.is_valid() 数据是否合法
    f['subject'].errors 看每个字段的出错消息:【errors】
    f.cleaned_data 数据的字典
    Form对象做的第二件事是校验数据。 为了校验数据,我们创建一个新的对Form象,并且传入一个与定义匹配的字典类型数据:
    >>> f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'})
    一旦你对一个Form实体赋值,你就得到了一个绑定form:
    >>> f.is_bound
    True
    调用任何绑定form的is_valid()方法,就可以知道它的数据是否合法。 我们已经为每个字段传入了值,因此整个Form是合法的:
    >>> f.is_valid()
    True
    如果我们不传入email值,它依然是合法的。因为我们指定这个字段的属性required=False:
    但是,如果留空subject或message,整个Form就不再合法了:
    >>> f = ContactForm({'subject': 'Hello'})
    >>> f.is_valid()
    False
    >>> f = ContactForm({'subject': 'Hello', 'message': ''})
    >>> f.is_valid()
    False
    可以逐一查看每个字段的出错消息:【errors】
    >>> f = ContactForm({'subject': 'Hello', 'message': ''})
    >>> f['message'].errors
    [u'This field is required.']
    >>> f['subject'].errors
    []
    >>> f['email'].errors
    []
    【cleaned_data】
    最终,如果一个Form实体的数据是合法的,它就会有一个可用的cleaned_data属性。 这是一个包含干净的提交数据的字典。
    Django的form框架不但校验数据,它还会把它们转换成相应的Python类型数据,这叫做清理数据。
    >>> f = ContactForm({'subject': 'Hello','email': 'adrian@example.com', 'message':'Nice site!'})
    >>> f.is_valid()
    True
    >>> f.cleaned_data
    {'message': u'Nice site!', 'email': u'adrian@example.com', 'subject': u'Hello'}

    二、在视图中使用Form对象
    1、在视图中使用Form对象
    # views.py
    from django.shortcuts import render_to_response
    from mysite.contact.forms import ContactForm

    def contact(request):
    if request.method == 'POST':
    form = ContactForm(request.POST)
    if form.is_valid():
    cd = form.cleaned_data
    send_mail(
    cd['subject'],
    cd['message'],
    cd.get('email', 'noreply@example.com'),
    ['siteowner@example.com'],
    )
    return HttpResponseRedirect('/contact/thanks/')
    else:
    form = ContactForm()
    return render_to_response('contact_form.html', {'form': form})

    # contact_form.html

    <html>
    <head>
    <title>Contact us</title>
    </head>
    <body>
    <h1>Contact us</h1>

    {% if form.errors %}
    <p style="color: red;">
    Please correct the error{{ form.errors|pluralize }} below.
    </p>
    {% endif %}

    <form action="" method="post">
    <table>
    {{ form.as_table }}
    </table>
    <input type="submit" value="Submit">
    </form>
    </body>
    </html>

    2、改变字段显示
    你可能首先注意到:当你在本地显示这个表单的时,message字段被显示成`` input type=”text”`` ,而它应该被显示成<`` textarea`` >。我们可以通过设置* widget* 来修改它:
    class ContactForm(forms.Form):
    subject = forms.CharField()
    email = forms.EmailField(required=False)
    message = forms.CharField(widget=forms.Textarea)
    3、设置最大长度
    class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    email = forms.EmailField(required=False)
    message = forms.CharField(widget=forms.Textarea)
    选项min_length参数同样可用。
    4、设置初始值
    让我们再改进一下这个表单:为字subject段添加* 初始值* : "I love your site!" (一点建议,但没坏处。)为此,我们可以在创建Form实体时,使用initial参数:
    def contact(request):
    if request.method == 'POST':
    form = ContactForm(request.POST)
    if form.is_valid():
    cd = form.cleaned_data
    send_mail(
    cd['subject'],
    cd['message'],
    cd.get('email', `'noreply@example.com`_'),
    [`'siteowner@example.com`_'],
    )
    return HttpResponseRedirect('/contact/thanks/')
    else:
    form = ContactForm(initial={'subject': 'I love your site!'})
    return render_to_response('contact_form.html', {'form': form})
    现在,subject字段将被那个句子填充。

    5、自定义校验规则
    我们有很多的方法把我们的自定义校验挂在Django的form上。 如果我们的规则会被一次又一次的使用,我们可以创建一个自定义的字段类型。
    大多数的自定义校验都是一次性的,可以直接绑定到form类.
    class ContactForm(forms.Form):
    subject = forms.CharField(max_length=10)
    email = forms.EmailField(required=False)
    message = forms.CharField(widget=forms.Textarea)

    def clean_message(self):
    message = self.cleaned_data['message']
    num_words = len(message.split())
    if num_words < 4:
    raise forms.ValidationError("Not enough words!")
    return message
    ` message`` 字段有一个额外的校验,我们增加一个`` clean_message()`` 方法到`` Form`` 类:
    Django的form系统自动寻找匹配的函数方法,该方法名称以clean_开头,并以字段名称结束。 如果有这样的方法,它将在校验时被调用。
    clean_message()方法将在指定字段的默认校验逻辑执行[之后]被调用。(本例中,在必填CharField这个校验逻辑之后。)因为字段数据已经被部分处理,
    所以它被从self.cleaned_data中提取出来了。同样,我们不必担心数据是否为空,因为它已经被校验过了。
    我们简单地使用了len()和split()的组合来计算单词的数量。 如果用户输入字数不足,我们抛出一个forms.ValidationError型异常。
    这个异常的描述会被作为错误列表中的一项显示给用户。
    在函数的末尾显式地返回字段的值非常重要。 我们可以在我们自定义的校验方法中修改它的值(或者把它转换成另一种Python类型)。
    如果我们忘记了这一步,None值就会返回,原始的数据就丢失掉了

    6、指定标签
    HTML表单中自动生成的标签默认是按照规则生成的:用空格代替下划线,首字母大写。如email的标签是"Email" 。
    同样的逻辑被用于模块(model)中字段的verbose_name值。)
    像在模块中做过的那样,我们同样可以自定义字段的标签.【仅需使用label】
    class ContactForm(forms.Form):
    subject = forms.CharField(max_length=100)
    email = forms.EmailField(required=False, label='Your e-mail address' )
    message = forms.CharField(widget=forms.Textarea)

    7、定制Form设计
    在上面的`` contact_form.html`` 模板中我们使用`` {{form.as_table}}`` 显示表单,不过我们可以使用其他更精确控制表单显示的方法。
    修改form的显示的最快捷的方式是使用CSS。 尤其是错误列表,可以增强视觉效果。自动生成的错误列表精确的使用`` <ul class=”errorlist”>`
    <html>
    <head>
    <title>Contact us</title>
    </head>
    <body>
    <h1>Contact us</h1>

    {% if form.errors %}
    <p style="color: red;">
    Please correct the error{{ form.errors|pluralize }} below.
    </p>
    {% endif %}

    <form action="" method="post">
    <div class="field">
    {{ form.subject.errors }}
    <label for="id_subject">Subject:</label>
    {{ form.subject }}
    </div>
    <div class="field">
    {{ form.email.errors }}
    <label for="id_email">Your e-mail address:</label>
    {{ form.email }}
    </div>
    <div class="field">
    {{ form.message.errors }}
    <label for="id_message">Message:</label>
    {{ form.message }}
    </div>
    <input type="submit" value="Submit">
    </form>
    </body>
    </html>

  • 相关阅读:
    actionscript3.0 的一些小技巧
    Flash 安全沙箱的意义
    明明连上了网,但是打不开网页
    关于电脑上可用内存太小的问题
    AS3 Starling 学习杂谈 (一) Quad类
    更新flash builder4,6 的AIR版本
    软件工程实践2017第二次作业
    软件工程实践2017第一次作业
    微信小程序开发指南合集 各类组件用法技巧
    微信小程序视频教程合集 附带源码、PPT下载
  • 原文地址:https://www.cnblogs.com/diege/p/2722660.html
Copyright © 2020-2023  润新知