当前位置:K88软件开发文章中心编程语言PythonPython01 → 文章内容

Django 表单

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-11 12:48:03

Django 表单HTML表单是网站交互性的经典方式。本章将介绍如何用Django对用户提交的表单数据进行处理。HTTP 请求HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。GET 方法我们在之前的项目中创建一个 search.py 文件,用于接收用户的请求: /HelloWorld/HelloWorld/search.py 文件代码:





# -*- coding:





utf-8 -*-from django.http import HttpResponsefrom django.shortcuts import render_to_response





# 表单def search_form(request):





return render_to_response('search_form.html')





# 接收请求数据def search(request):





request.encoding='utf-8'if 'q' in request.GET:





message = '你搜索的内容为:





' + request.GET['q']else:





message = '你提交了空表单'return HttpResponse(message)在模板目录 templates 中添加 search_form.html 表单: /HelloWorld/templates/search_form.html 文件代码:<!DOCTYPE html><html><head><meta charset="utf-8"><title>k88.net(k88.net)</title></head><body><form action="/search" method="get"><input type="text" name="q"><input type="submit" value="搜索"></form></body></html> urls.py 规则修改为如下形式: /HelloWorld/HelloWorld/urls.py 文件代码:from django.conf.urls import urlfrom . import view,testdb,searchurlpatterns = [url(r'^hello$', view.hello),url(r'^testdb$', testdb.testdb),url(r'^search-form$', search.search_form),url(r'^search$', search.search),]访问地址 http:





//127.0.0.1:





8000/search-form 并搜索,结果如下所示:





POST 方法上面我们使用了GET方法。视图显示和请求处理分成两个函数处理。提交数据时更常用POST方法。我们下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。我们在 templates 创建 post.html: /HelloWorld/templates/post.html 文件代码:<!DOCTYPE html><html><head><meta charset="utf-8"><title>k88.net(k88.net)</title></head><body><form action="/search-post" method="post">{% csrf_token %}<input type="text" name="q"><input type="submit" value="Submit"></form><p>{{ rlt }}</p></body></html>在模板的末尾,我们增加一个 rlt 记号,为表格处理结果预留位置。表格后面还有一个{% csrf_token %}的标签。csrf 全称是 Cross Site Request Forgery。这是Django提供的防止伪装提交请求的功能。POST 方法提交的表格,必须有此标签。 在HelloWorld目录下新建 search2.py 文件并使用 search_post 函数来处理 POST 请求: /HelloWorld/HelloWorld/search2.py 文件代码:





# -*- coding:





utf-8 -*-from django.shortcuts import renderfrom django.views.decorators import csrf





# 接收POST请求数据def search_post(request):





ctx ={}if request.POST:





ctx['rlt'] = request.POST['q']return render(request, "post.html", ctx) urls.py 规则修改为如下形式: /HelloWorld/HelloWorld/urls.py 文件代码:from django.conf.urls import urlfrom . import view,testdb,search,search2urlpatterns = [url(r'^hello$', view.hello),url(r'^testdb$', testdb.testdb),url(r'^search-form$', search.search_form),url(r'^search$', search.search),url(r'^search-post$', search2.search_post),]访问 http:





//127.0.0.1:





8000/search-post 显示结果如下:完成以上实例后,我们的目录结构为:HelloWorld|-- HelloWorld| |-- __init__.py| |-- __init__.pyc| |-- search.py| |-- search.pyc| |-- search2.py| |-- search2.pyc| |-- settings.py| |-- settings.pyc| |-- testdb.py| |-- testdb.pyc| |-- urls.py| |-- urls.pyc| |-- view.py| |-- view.pyc| |-- wsgi.py| `-- wsgi.pyc|-- TestModel| |-- __init__.py| |-- __init__.pyc| |-- admin.py| |-- admin.pyc| |-- apps.py| |-- migrations| | |-- 0001_initial.py| | |-- 0001_initial.pyc| | |-- __init__.py| | `-- __init__.pyc| |-- models.py| |-- models.pyc| |-- tests.py| `-- views.py|-- db.sqlite3|-- manage.py`-- templates |-- base.html |-- hello.html |-- post.html `-- search_form.htmlRequest 对象每个 view 函数的第一个参数是一个 HttpRequest 对象,就像下面这个 hello() 函数:





from django.http import HttpResponsedef hello(request):





return HttpResponse("Hello world")HttpRequest对象包含当前请求URL的一些信息:属性描述path请求页面的全路径,不包括域名—例如, "/hello/"。method请求中使用的HTTP方法的字符串表示。全大写表示。例如:





if request.method == 'GET':





    do_something()elif request.method == 'POST':





    do_something_else()GET包含所有HTTP GET参数的类字典对象。参见QueryDict 文档。POST包含所有HTTP POST参数的类字典对象。参见QueryDict 文档。服务器收到空的POST请求的情况也是有可能发生的。也就是说,表单form通过HTTP POST方法提交请求,但是表单中可以没有数据。因此,不能使用语句if request.POST来判断是否使用HTTP POST方法;应该使用if request.method == "POST" (参见本表的method属性)。注意:





POST不包括file-upload信息。参见FILES属性。REQUEST为了方便,该属性是POST和GET属性的集合体,但是有特殊性,先查找POST属性,然后再查找GET属性。借鉴PHP's $_REQUEST。例如,如果GET = {"name":





"john"} 和POST = {"age":





'34'},则 REQUEST["name"] 的值是"john", REQUEST["age"]的值是"34".强烈建议使用GET and POST,因为这两个属性更加显式化,写出的代码也更易理解。COOKIES包含所有cookies的标准Python字典对象。Keys和values都是字符串。FILES包含所有上传文件的类字典对象。FILES中的每个Key都是<input type="file" name="" />标签中name属性的值. FILES中的每个value 同时也是一个标准Python字典对象,包含下面三个Keys:





filename:





上传文件名,用Python字符串表示content-type:





上传文件的Content typecontent:





上传文件的原始内容注意:只有在请求方法是POST,并且请求

[1] [2]  下一页


Django 表单