Django开发入门——表单

第一个Form类

Django带有一个form库,成为django.forms,这个库可以处理HTML表单显示以及验证。表单框架最主要的用法是为每一个将要处理的HTML的‘’定义一个类。
在books中专门创建一个关于forms的文件,forms.py

from django import forms


class ContactForm(forms.Form):
    subject=forms.CharField()
    #required=False表示该字段是选填的
    email=forms.EmailField(required=False)
    message=forms.CharField()
  • Form对象做的第一件事:
    将自己显示成HTML
>>> from books.forms import ContactForm
>>> f=ContactForm()
>>> f

>>> print(f)




默认输出按照HTML的

格式,但是开闭标记没有包含于输出当中。这样你就可以添加额外的行或者自定义格式。

  • Form对象做的第二件事:
    校验数据
>>> 
#使用is_valid()方法,如果合法则返回True
f=ContactForm({'subject':'hello','email':'[email protected]','message':'you will success'})
>>> f.is_valid()
True
#如果不合法返回False,可以查看每个字段的出错信息
>>> f=ContactForm({'subject':'','email':'[email protected]','message':'you will success'})
>>> f.is_valid()
False
>>> f['subject'].errors
['This field is required.']
>>> f['email'].errors
[]

  • Form对象做的最后一件事情:
    清理的数据,如果数据是合法的它就会有一个可用的cleaned_data属性。这是一条包含干净的提交数据的字典。将数据转换成相应的Python类型的数据。
>>> f=ContactForm({'subject':'hello','email':'[email protected]','message':'you will success'})
>>> f.is_valid()
True
>>> f.cleaned_data
{'subject': 'hello', 'email': '[email protected]', 'message': 'you will success'}

contact form只涉及字符串类型,它们会被清理成Unicode对象,如果使用整数或日期型,form方法会确保方法使用合适的Python整数型或datetime.data型对象。
在视图中使用Form对象

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','[email protected]'),
                ['[email protected]'],
            )
            return HttpResponseRedirect('/contact/')
    else:
        form=ContactForm()
    return render_to_response('contact_form.html', {'form':form})

templates/contact_form.html




    
    Contact_us


    {% if form.errors %}
        

Please corrent the error{{ form.errors|pluralize }} below.

{% endif %}
{{ form.as_table }}

在urls.py中添加映射关系然后运行服务。
改变字段显示

class ContactForm(forms.Form):
    subject=forms.CharField()
    #required=False表示该字段是选填的
    email=forms.EmailField(required=False)
    #改变了字段类型
    message=forms.CharField(widget=forms.Textarea)

forms框架把每一个字段的显示逻辑部分分离到一组部件(widget)中。每一个字段类型都拥有一个默认的部件,可以替换掉默认部件或者提供一个定义的部件。field表现校验逻辑,而部件表示显示逻辑。
设置字段内容长度

class ContactForm(forms.Form):
    subject=forms.CharField(max_length=100,min_length=50)
    #required=False表示该字段是选填的
    email=forms.EmailField(required=False)
    message=forms.CharField(widget=forms.Textarea)

设置初始值


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','[email protected]'),
                ['[email protected]'],
            )
            return HttpResponseRedirect('/contact/')
    else:
        form=ContactForm(
            initial={'subject':'you will success'}
        )
    return render_to_response('contact_form.html', {'form':form})

传入初始值数据和传入数据绑定表单是有区别的,如果仅传入初始值数据,表但是unbound的,那意味着它没有错误消息。
自定义校验规则
Django的form系统会自动寻找匹配的函数方法,该方法以clean_开有,并以字段名结束。如果有这样的方法,他将在校验时被调用。

class ContactForm(forms.Form):
    subject=forms.CharField(max_length=100,min_length=50)
    #required=False表示该字段是选填的
    email=forms.EmailField(required=False)
    message=forms.CharField(widget=forms.Textarea)

    def clean_message(self):
        message=self.cleaned_data['message']
        num_word=len(message.split())
        if num_word < 4:
            raise forms.ValidationError("Not enough words")
        return message

指定标签

class ContactForm(forms.Form):
    subject=forms.CharField(max_length=100,min_length=50)
    #required=False表示该字段是选填的
    email=forms.EmailField(required=False,label='Your e-mail')
    message=forms.CharField(widget=forms.Textarea)

你可能感兴趣的:(Django)