当前位置:K88软件开发文章中心网站服务器框架django → 文章内容

Django 表单处理

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-25 14:19:17

_valid()True>>> f.cleaned_data{message': uNice site!, email: uadrian@example.com, subject: uHello}我们的contact form只涉及字符串类型,它们会被清理成Unicode对象。如果我们使用整数型或日期型,form框架会确保方法使用合适的Python整数型或datetime.date型对象。在视图中使用Form对象在学习了关于Form类的基本知识后,你会看到我们如何把它用到视图中,取代contact()代码中不整齐的部分。 一下示例说明了我们如何用forms框架重写contact():# views.pyfrom django.shortcuts import render_to_responsefrom mysite.contact.forms import ContactFormdef 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>看看,我们能移除这么多不整齐的代码! Django的forms框架处理HTML显示、数据校验、数据清理和表单错误重现。尝试在本地运行。 装载表单,先留空所有字段提交空表单;继而填写一个错误的邮箱地址再尝试提交表单;最后再用正确数据提交表单。 (根据服务器的设置,当send_mail()被调用时,你将得到一个错误提示。而这是另一个问题。)改变字段显示你可能首先注意到:当你在本地显示这个表单的时,message字段被显示成input type=”text” ,而它应该被显示成。我们可以通过设置 widget 来修改它:from django import formsclass ContactForm(forms.Form): subject = forms.CharField() email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea )forms框架把每一个字段的显示逻辑分离到一组部件(widget)中。 每一个字段类型都拥有一个默认的部件,我们也可以容易地替换掉默认的部件,或者提供一个自定义的部件。考虑一下Field类表现 校验逻辑 ,而部件表现 显示逻辑 。设置最大长度一个最经常使用的校验要求是检查字段长度。 另外,我们应该改进ContactForm,使subject限制在100个字符以内。 为此,仅需为CharField提供max_length参数,像这样:from django import formsclass ContactForm(forms.Form): subject = forms.CharField(max_length=100 ) email = forms.EmailField(required=False) message = forms.CharField(widget=forms.Textarea)选项min_length参数同样可用。设置初始值让我们再改进一下这个表单:为字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字段将被那个句子填充。请注意,传入 初始值 数据和传入数据以 绑定 表单是有区别的。 最大的区别是,如果仅传入 初始值 数据,表单是_unbound_的,那意味着它没有错误消息。自定义校验规则假设我们已经发布了反馈页面了,email已经开始源源不断地涌入了。 这里有一个问题: 一些提交的消息只有一两个字,我们无法得知详细的信息。 所以我们决定增加一条新的校验: 来点专业精神,最起码写四个字,拜托。我们有很多的方法把我们的自定义校验挂在Django的form上。 如果我们的规则会被一次又一次的使用,我们可以创建一个自定义的字段类型。 大多数的自定义校验都是一次性的,可以直接绑定到form类.我们希望message 字段有一个额外的校验,我们增加一个clean_message() 方法到Form 类:from django import formsclass ContactForm(forms.Form): subject = forms.CharField(max_length=100) 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 messageDjango的form系统自动寻找匹配的函数方法,该方法名称以clean_开头,并以字段名称结束。 如果有这样的方法,它将在校验时被调用。特别地,clean_message()方法将在指定字段的默认校验逻辑执行 之后 被调用。(本例中,在必填CharField这个校验逻辑之后。)因为字段数据已经被部分处理,所以它被从self.cleaned_data中提取出来了。同样,我们不必担心数据是否为空,因为它已经被校验过了。我们简单地使用了len()和split()的组合来计算单词的数量。 如果用户输入字数不足,我们抛出一个forms.ValidationError型异常。这个异常的描述会被作为错误列表中的一项显示给用户。在函数的末尾显式地返回字段的值非常重要。 我们可以在我们自定义的校验方法中修改它的值(或者把它转换成

上一页  [1] [2] [3] [4] [5] [6] [7]  下一页


Django 表单处理