Django框架表单操作实例分析


Posted in Python onNovember 04, 2019

本文实例讲述了Django框架表单操作。分享给大家供大家参考,具体如下:

HTML表单是网站交互性的经典方式。 开始学习如何用Django对用户提交的表单数据进行处理。

HTTP 请求

HTTP协议以"请求-回复"的方式工作。客户发送请求时,可以在请求中附加数据。服务器通过解析请求,就可以获得客户传来的数据,并根据URL来提供特定的服务。

GET 方法

在之前的项目中创建一个 search.py 文件,用于接收用户的请求:

/djangoPro/djangoPro/search.py 文件代码:

# -*- coding: utf-8 -*-
from django.http import HttpResponse
from 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 表单:

/djangoPro/templates/search_form.html 文件代码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>
<form action="/search" method="get">
<input type="text" name="q">
<input type="submit" value="搜索">
</form>
</body>
</html>

urls.py 规则修改为如下形式:

POST 方法

上面使用了GET方法。视图显示和请求处理分成两个函数处理。

提交数据时更常用POST方法。下面使用该方法,并用一个URL和处理函数,同时显示视图和处理请求。

在 templates 创建 post.html:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</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 请求:

/djangoPro/djangoPro/search2.py 文件代码:

# -*- coding: utf-8 -*-
from django.shortcuts import render
from 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 规则修改为如下形式:

from django.conf.urls import url
from . import view,testdb,search,search2
urlpatterns = [
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),
]

Request 对象

每个 view 函数的第一个参数是一个 HttpRequest 对象,就像下面这个 hello() 函数:

from django.http import HttpResponse
def 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都是标签中name属性的值. FILES中的每个value 同时也是一个标准Python字典对象,包含下面三个Keys: filename: 上传文件名,用Python字符串表示 content-type: 上传文件的Content type content: 上传文件的原始内容 注意:只有在请求方法是POST,并且请求页面中
有enctype="multipart/form-data"属性时FILES才拥有数据。否则,FILES 是一个空字典。
META 包含所有可用HTTP头部信息的字典。 例如: CONTENT_LENGTH CONTENT_TYPE QUERY_STRING: 未解析的原始查询字符串 REMOTE_ADDR: 客户端IP地址 REMOTE_HOST: 客户端主机名 SERVER_NAME: 服务器主机名 SERVER_PORT: 服务器端口 META 中这些头加上前缀HTTP_最为Key, 例如: HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE HTTP_HOST: 客户发送的HTTP主机头信息 HTTP_REFERER: referring页 HTTP_USER_AGENT: 客户端的user-agent字符串 HTTP_X_BENDER: X-Bender头信息
user 是一个django.contrib.auth.models.User 对象,代表当前登录的用户。 如果访问用户当前没有登录,user将被初始化为django.contrib.auth.models.AnonymousUser的实例。 你可以通过user的is_authenticated()方法来辨别用户是否登录:   if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users. 只有激活Django中的AuthenticationMiddleware时该属性才可用
session 唯一可读写的属性,代表当前会话的字典对象。只有激活Django中的session支持时该属性才可用。
raw_post_data 原始HTTP POST数据,未解析过。 高级处理时会有用处。

Request对象也有一些有用的方法:

方法 描述
__getitem__(key) 返回GET/POST的键值,先取POST,后取GET。如果键不存在抛出 KeyError。  这是我们可以使用字典语法访问HttpRequest对象。  例如,request["foo"]等同于先request.POST["foo"] 然后 request.GET["foo"]的操作。
has_key() 检查request.GET or request.POST中是否包含参数指定的Key。
get_full_path() 返回包含查询字符串的请求路径。例如, "/music/bands/the_beatles/?print=true"
is_secure() 如果请求是安全的,返回True,就是说,发出的是HTTPS请求。

QueryDict对象

在HttpRequest对象中, GET和POST属性是django.http.QueryDict类的实例。

QueryDict类似字典的自定义类,用来处理单键对应多值的情况。

QueryDict实现所有标准的词典方法。还包括一些特有的方法:

方法 描述
__getitem__ 和标准字典的处理有一点不同,就是,如果Key对应多个Value,__getitem__()返回最后一个value。
__setitem__ 设置参数指定key的value列表(一个Python list)。注意:它只能在一个mutable QueryDict 对象上被调用(就是通过copy()产生的一个QueryDict对象的拷贝).
get() 如果key对应多个value,get()返回最后一个value。
update() 参数可以是QueryDict,也可以是标准字典。和标准字典的update方法不同,该方法添加字典 items,而不是替换它们: >>> q = QueryDict('a=1') >>> q = q.copy() # to make it mutable >>> q.update({'a': '2'}) >>> q.getlist('a') ['1', '2'] >>> q['a'] # returns the last ['2']
items() 和标准字典的items()方法有一点不同,该方法使用单值逻辑的__getitem__(): >>> q = QueryDict('a=1&a=2&a=3') >>> q.items() [('a', '3')]
values() 和标准字典的values()方法有一点不同,该方法使用单值逻辑的__getitem__():

此外, QueryDict也有一些方法,如下表:

方法 描述
copy() 返回对象的拷贝,内部实现是用Python标准库的copy.deepcopy()。该拷贝是mutable(可更改的) — 就是说,可以更改该拷贝的值。
getlist(key) 返回和参数key对应的所有值,作为一个Python list返回。如果key不存在,则返回空list。 It's guaranteed to return a list of some sort..
setlist(key,list_) 设置key的值为list_ (unlike __setitem__()).
appendlist(key,item) 添加item到和key关联的内部list.
setlistdefault(key,list) 和setdefault有一点不同,它接受list而不是单个value作为参数。
lists() 和items()有一点不同, 它会返回key的所有值,作为一个list, 例如: >>> q = QueryDict('a=1&a=2&a=3') >>> q.lists() [('a', ['1', '2', '3'])]
urlencode() 返回一个以查询字符串格式进行格式化后的字符串(e.g., "a=2&b=3&b=5").

希望本文所述对大家基于Django框架的Python程序设计有所帮助。

Python 相关文章推荐
Python图像灰度变换及图像数组操作
Jan 27 Python
Python中动态检测编码chardet的使用教程
Jul 06 Python
Python调用ctypes使用C函数printf的方法
Aug 23 Python
python实现冒泡排序算法的两种方法
Mar 10 Python
Python自然语言处理 NLTK 库用法入门教程【经典】
Jun 26 Python
Python设计模式之享元模式原理与用法实例分析
Jan 11 Python
python Django里CSRF 对应策略详解
Aug 05 Python
python标准库sys和OS的函数使用方法与实例详解
Feb 12 Python
使用 Python 遍历目录树的方法
Feb 29 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
Mar 03 Python
Python 恐龙跑跑小游戏实现流程
Feb 15 Python
Python GUI编程之tkinter 关于 ttkbootstrap 的使用详解
Mar 03 Python
ubuntu 18.04 安装opencv3.4.5的教程(图解)
Nov 04 #Python
Django框架模板用法入门教程
Nov 04 #Python
python matplotlib折线图样式实现过程
Nov 04 #Python
Django框架创建项目的方法入门教程
Nov 04 #Python
Python jieba库用法及实例解析
Nov 04 #Python
Django框架安装方法图文详解
Nov 04 #Python
python定时任务 sched模块用法实例
Nov 04 #Python
You might like
PHP制作3D扇形统计图以及对图片进行缩放操作实例
2014/10/23 PHP
PHP使用MPDF类生成PDF的方法
2015/12/08 PHP
php生成Android客户端扫描可登录的二维码
2016/05/13 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
js新闻滚动 js如何实现新闻滚动效果
2013/01/07 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
JavaScript中的变量作用域介绍
2014/12/31 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
bootstrapfileinput实现文件自动上传
2016/11/08 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
2020/04/16 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
Vue formData实现图片上传
2019/08/20 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
微信小程序之左右布局的实现代码
2019/12/13 Javascript
基于Vue3.0开发轻量级手机端弹框组件V3Popup的场景分析
2020/12/30 Vue.js
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
对于Python的Django框架部署的一些建议
2015/04/09 Python
python实现矩阵乘法的方法
2015/06/28 Python
python导入时小括号大作用
2017/01/10 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Python序列循环移位的3种方法推荐
2018/04/09 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
简述python Scrapy框架
2020/08/17 Python
《海底世界》教学反思
2014/04/16 职场文书
房地产活动策划方案
2014/05/14 职场文书
科技之星事迹材料
2014/06/02 职场文书
2014领导班子专题民主生活会对照检查材料思想汇报
2014/09/23 职场文书
2014年幼儿园园长工作总结
2014/12/17 职场文书
政府会议通知范文
2015/04/15 职场文书
志愿者服务宣传标语口号
2015/12/26 职场文书
创业计划书之服装
2019/10/07 职场文书
python通配符之glob模块的使用详解
2021/04/24 Python
linux中nohup和后台运行进程查看及终止
2021/06/24 Python