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映射拆分操作符用法实例
May 19 Python
Python获取当前函数名称方法实例分享
Jan 18 Python
python 请求服务器的实现代码(http请求和https请求)
May 25 Python
详解Django+uwsgi+Nginx上线最佳实战
Mar 14 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
python实现快递价格查询系统
Mar 03 Python
PyTorch安装与基本使用详解
Aug 31 Python
一文详述 Python 中的 property 语法
Sep 01 Python
python 制作简单的音乐播放器
Nov 25 Python
Django如何与Ajax交互
Apr 29 Python
Python实现仓库管理系统
May 30 Python
Python实现聚类K-means算法详解
Jul 15 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程序员的技术瓶颈分析
2011/07/17 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
PHP文件系统管理(实例讲解)
2017/09/19 PHP
Yii2框架实现利用mpdf创建pdf文件功能示例
2019/02/08 PHP
laravel请求参数校验方法
2019/10/10 PHP
一个可绑定数据源的jQuery数据表格插件
2010/07/17 Javascript
js调用activeX获取u盘序列号的代码
2011/11/21 Javascript
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
node.js中的fs.lstatSync方法使用说明
2014/12/16 Javascript
详解AngularJS 模态对话框
2016/04/07 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
详解vue-Resource(与后端数据交互)
2017/01/16 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
vue子组件使用自定义事件向父组件传递数据
2017/05/27 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
NodeJS搭建HTTP服务器的实现步骤
2018/10/12 NodeJs
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
深入理解Python变量与常量
2016/06/02 Python
Python实现选择排序
2017/06/04 Python
基于Django的python验证码(实例讲解)
2017/10/23 Python
python @property的用法及含义全面解析
2018/02/01 Python
使用Numpy读取CSV文件,并进行行列删除的操作方法
2018/07/04 Python
Django Rest framework之认证的实现代码
2018/12/17 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
Perfume’s Club澳大利亚官网:西班牙领先的在线美容店
2021/02/01 全球购物
nohup的用法
2014/08/10 面试题
node中使用shell脚本的方法步骤
2021/03/23 Javascript
建筑个人求职信范文
2014/01/25 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
「我的青春恋爱物语果然有问题。-妄言录-」第20卷封面公开
2022/03/21 日漫
SpringBoot项目多数据源及mybatis 驼峰失效的问题解决方法
2022/07/07 Java/Android
CSS 实现磨砂玻璃(毛玻璃)效果样式
2023/05/21 HTML / CSS