千与千寻django(七)---表单(form)
2013-03-27 01:46
429 查看
基础
在views.py中的每一个用于显示页面的函数都需要以request作为第一个函数参数。request包含了一些有用的信息,如:
request.path 除去了域名和端口的访问路径,
request.get_host 域名+端口信息
request.get_full_path() 所有路径,包含传递的参数
requets.is_secure() 是否使用https进行链接
还有一个特别的属性request.META,它是一个dict类型,包含了所有HTTP header信息,不过也要根据用户
的实际环境来决定。如
HTTP_REFERER
HTTP_USER_AGENT 用户使用的浏览器信息
REMOTE_ADDR 用户的IP,如果使用代理,也可以显示出来
关于表单的一个小例子
urls.py:from django.conf.urls import patterns, include, url from books.views import hello, search_form, search urlpatterns = patterns('', url(r'^search-form/$', search_form), url(r'^search/$', search), )views.py
from django.http import HttpResponse from django.shortcuts import render_to_response from books.models import Book def search_form(request): return render_to_response('serctform.html') def search(request): if 'q' in request.GET: q = request.GET['q'] books = Book.objects.filter(title=q) return render_to_response('search_results.html', {'books' : books, 'query':q}) else: message = 'You submitted an empty form.' return HttpResponse(message)
search_results.html
<html> <body> <p>Your searched for '{{ query }}' {% if books %} {% for book in books %} <li>{{ book.title }}</li> {% endfor %} {% else %} <p>No books found. {% endif %} </body> </html>serctform.html
<!DOCTYPE form PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <body> <form action="/search/" method="get"> <input type="text" name="q"> <input type="submit" value="Search"> </form> </body> </html>
注:如果有的同学遇到Non-ASCII character '\xe6这样的错误,是因为编码错误,在py文件中加入:
# This Python file uses the following encoding: utf-8
就行了
关于重定向
你应当总是在一个成功处理POST请求之后进行redirect,这样可以避免用户多次点击提交按钮带来的二次请求问题,有时会造成不好的后果,如向数据库插入重复记录等。
from django.http import HttpResponseRedirect
return HttpResponseRedirect('/success/')
使用Django的form system来简化表单工作
在app文件夹下创建forms.py,其实在哪里创建都可以:
from django import forms
class ContactForm(forms.Form):
subject = forms.CharField()
email = forms.EmailField(required=False)
message = forms.CharField()
form的定义和model类的定义很像。我们可以使用python manage.py shell来查看form类的信息。
可以看到打印出来的f的信息其实是网页格式的。
也可以改变默认表格的格式。
这里的<table>,<ul>都没有包含在输出里,所以可以自由地添加行等。
除了打印出整个form的HTML内容,还可以打印出局的字段的内容。
还可以使用form类进行验证,使用dict对form类进行初始化。
>>> f = ContactForm({'subject': 'Hello', 'email': 'adrian@example.com', 'message': 'Nice'})
>>> f.is_bound #是否绑定表单类
True
>>> f.is_valid() #数据内容是否合法
True
当数据全部合法时,可以使用clean_data这个属性,用来得到经过'clean'格式化的数据,会所提交过
来的数据转化成合适的Python的类型。
使用from表单
views.py:from django.shortcuts import render_to_response from mysite.contact.forms import ContactForm def contact(request): #可以不写,因为python中if中定义的变量,也可以在整个函数中可见 form = None if request.method == 'POST': form = ContactForm(request.POST) if form.is_valid(): cd = form.cleaned_data send_mail( cd['subject'], cd['message'], '463349267@qq.com', ['Senssic@163.com'], ) return render_to_response('thiks.html') 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;"> {# pulralize 是filter,用来判断是否为添加's'来表示单词的复数形式#} Please correct the error{{ form.errors|pluralize }} below. </p> {% endif %} <form action="" method="post"> <table> {% csrf_token %} {# 可以使用as_ul, as_p来改变格式 #} {{ form.as_table }} </table> <input type="submit" value="Submit"> </form> </body> </html>因为是发送一个邮件所以要在settings.py中配置在settings中添加如下内容
EMAIL_HOST = 'smtp.qq.com'#smtp服务的地址
EMAIL_PORT = '25'#端口
EMAIL_HOST_USER = '463349267'#用户名
EMAIL_HOST_PASSWORD = 'qiyu****'#密码,呵呵就不显示了
运行成功,好了我们赶紧看看我们的邮箱,Senssic@163.com这个是我的网易邮箱,我用的是我的qq邮箱发送的
噢耶,成功了
注意:有些同学可能遇到ERROR10061的错误,是因为我们的settings中没有相关的配置,按照上面的配置一下就好了
还有的可能遇到“STARTTLS extension not supported by server”这样的错误是因为你的代码里指定了使用TLS(EMAIL_USE_TLS=True)收发邮件,但是你的服务器没有配置支持TLS。所以将settings里面的EMAIL_USE_TLS
= True 注释掉就行了
相关文章推荐
- django 学习个人总结 之form表单提交
- django form表单组建使用及CBV模式
- Form表单(Django系列5)
- 如何得到django中form表单里的复选框(多选框)的值( MultipleChoiceField )
- Django-Form表单(验证、定制、错误信息、Select)
- django Modelform表单自定义控件
- [Django与表单]写一个简单的Django form表单处理
- django(7)modelform操作及验证、ajax操作普通表单数据提交、文件上传、富文本框基本使用
- Django中 form表单的使用
- Django的form表单
- 第三百一十一节,Django框架,Form表单验证
- Python自动化运维系列之Django Form表单验证
- Django表单Form进阶笔记
- django-form表单的提交
- Django URL传参 FORM表单传数据 get post用法示例
- django form表单组建使用及CBV模式
- 使用Django的ModelForm对表单进行自动验证(可自定义验证规则)
- Django之form表单提交并验证
- 循序渐进Python3(十三) --0-- django之form表单