设为首页 加入收藏

TOP

Django学习笔记(五)―― 表单(二)
2015-07-20 18:06:46 来源: 作者: 【 】 浏览:26
Tags:Django 学习 笔记 表单

?

在templates中添加contact_form.html :

?

 
  
 

Contact us

{% if errors %}
  • {% for error in errors %}
  • {{ error }}
  • {% endfor %}
{% endif %}
{% csrf_token %}

Subject:

Your e-mail (optional):

Message:

?

?

这个例子看起来杂乱,解决方法看下面用forms。

?

5. from类

?

上面的那个例子,看起来杂乱,并且容易出错。

Django带有一个form库,称为django.forms,这个库可以处理HTML表单显示以及验证。

?

新建 forms.py 加入

?

from django import forms

class ContactForm(forms.Form):
    subject = forms.CharField()
    email = forms.EmailField(required=False)
    message = forms.CharField()

?

很像模块中用的语法。默认是每个字段必填的,如果要是可以不填的要指定required=False,就像上面的email字段一样。

?

来看看forms类到底是什么:它做的第一个是就是将自己显示成HTML

?

>>> from contact.forms import ContactForm
>>> f = ContactForm()
>>> print f




?

默认是按照

现实输出的,还可以:

?

?

>>> print f.as_ul()
  • >>> print f.as_p()

    ?

    ?

    还可以这样显示

    ?

    >>> print f['subject']
    

    ?

    ?

    forms对象做的第二件事是校验数据。现在先添加数据:

    ?

    >>> f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice site!'})
    >>> 

    ?

    一旦对一个forms对象实体赋值,就可以得到一个绑定的form:

    ?

    >>> f.is_bound
    True
    >>> 

    ?

    ?

    还可以验证数据是否合法

    ?

    >>> f.is_valid()
    True
    >>> 

    ?

    如果合法为True。如果不合法为False。如:如果subject或者,essage为空。f.is_valid()就会返回False

    ?

    也可以查看每个字段的error

    ?

    >>> f = ContactForm({'subject': 'Hello', 'message': ''})
    >>> f['message'].errors
    [u'This field is required.']
    >>> f['subject'].errors
    []
    >>> 


    ?

    还可以通过errors属性查看错误

    ?

    >>> f.errors
    {'message': [u'This field is required.']}
    >>> 

    ?

    ?

    如果forms合法,他就有一个cleaned_data属性,将数据转化成Python类型数据,存放在cleaned_data中。

    例如:如果是字符串就会被清理成Unicode对象,整数会被清理成Python整数,日期清理成datetime.date型对象

    ?

    >>> 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'}

    ?

    ?

    ?

    6. 在视图中使用Form对象

    ?

    例子:

    ?

    view.py

    ?

    from django.shortcuts import render
    from contact.forms import ContactForm
    from django.http import HttpResponseRedirect
    from django.core.mail import send_mail
    
    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(request, 'contact_form.html', {'form': form})
    

    ?

    ?


    contact_form.html

    ?

     
        
    {{ form.as_table }}
    {% csrf_token %}

    ?

    上面的例子有个缺陷,message这个表单变成了 input type=“text”。

    我们可以通过设置widget来修改它:

    ?

    from django import forms
    
    class ContactForm(forms.Form):
        subject = forms.CharField()
        email = forms.EmailField(required=False)
        message = forms.CharField(widget=forms.Textarea)
    


    ?

    还可以设置最大长度

    设置max_length

    ?

    from django import forms
    
    class ContactForm(forms.Form):
        subject = forms.CharField(max_length=20)
        email = forms.EmailField(required=False)
        message = forms.CharField(widget=forms.Textarea)
    


    ?

    设置初始值:

    ?

    在view.py中ContectForm中添加 initial 参数:

    ?

    from django.shortcuts import render
    from contact.forms import ContactForm
    from django.http import HttpResponseRedirect
    from django.core.mail import send_mail
    
    def contact(request):
        if request.method == 'POST':
            form = ContactForm(request.POST)
            if form.is_valid():
                cd
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇POJ 1915: Knight Moves 下一篇UVALive 6469 Deranged Exams (排..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: