Django框架中表单的用法


Posted in Python onJune 10, 2022

HTML表单是网站交互性的经典方式。 本章将介绍如何用Django对用户提交的表单数据进行处理。

一、HTTP 请求

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

1、GET 方法

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

/HelloWorld/HelloWorld/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 and request.GET['q']:
        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>菜鸟教程(runoob.com)</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 url
from . import view,testdb,search
 
urlpatterns = [
    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 并搜索,结果如下所示:

Django框架中表单的用法

2、POST 方法

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

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

我们在 templates 创建 post.html:

/HelloWorld/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 请求:

/HelloWorld/HelloWorld/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 规则修改为如下形式:

/HelloWorld/HelloWorld/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),
]

访问 http://127.0.0.1:8000/search-post 显示结果如下:

Django框架中表单的用法

完成以上实例后,我们的目录结构为:

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.html

二、Request 对象

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

from django.http import HttpResponse

def hello(request):
    return HttpResponse("Hello world")

HttpRequest对象包含当前请求URL的一些信息:

Django框架中表单的用法

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

Django框架中表单的用法

1、QueryDict对象

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

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

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

Django框架中表单的用法

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

Django框架中表单的用法

到此这篇关于Django框架中表单用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。


Tags in this post...

Python 相关文章推荐
python调用cmd复制文件代码分享
Dec 27 Python
python输出指定月份日历的方法
Apr 23 Python
python 堆和优先队列的使用详解
Mar 05 Python
Python学习笔记之读取文件、OS模块、异常处理、with as语法示例
Jun 04 Python
Django Channels 实现点对点实时聊天和消息推送功能
Jul 17 Python
python实现按行分割文件
Jul 22 Python
通过字符串导入 Python 模块的方法详解
Oct 27 Python
python__new__内置静态方法使用解析
Jan 07 Python
Python super()函数使用及多重继承
May 06 Python
Python爬取12306车次信息代码详解
Aug 12 Python
python 通过pip freeze、dowload打离线包及自动安装的过程详解(适用于保密的离线环境
Dec 14 Python
Python实现文字pdf转换图片pdf效果
Apr 03 Python
移除Selenium中window.navigator.webdriver值
Jun 10 #Python
Django框架模板用法详解
Jun 10 #Python
python库Tsmoothie模块数据平滑化异常点抓取
使用Django框架创建项目
Jun 10 #Python
Python实现信息管理系统
Jun 05 #Python
python实现学员管理系统(面向对象版)
Jun 05 #Python
python实现学生信息管理系统(面向对象)
Jun 05 #Python
You might like
音乐朗读剧《MARS RED》2021年TV动画化决定!
2020/03/06 日漫
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
什么是JavaScript
2009/08/13 Javascript
JavaScript中为元素加上name属性的方法
2011/05/09 Javascript
UI Events 用户界面事件
2012/06/27 Javascript
了解一点js的Eval函数
2012/07/26 Javascript
Javascript delete 引用类型对象
2013/11/01 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
Angular.js通过自定义指令directive实现滑块滑动效果
2017/10/13 Javascript
详解webpack3编译兼容IE8的正确姿势
2017/12/21 Javascript
深入解析Vue源码实例挂载与编译流程实现思路详解
2019/05/05 Javascript
解决layer.msg 不居中 ifram中的问题
2019/09/05 Javascript
Postman动态获取返回值过程详解
2020/06/30 Javascript
对vue生命周期的深入理解
2020/12/03 Vue.js
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
Python求解平方根的方法
2015/03/11 Python
分享Python字符串关键点
2015/12/13 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python的Tornado框架的异步任务与AsyncHTTPClient
2016/06/27 Python
Python实现字符串格式化的方法小结
2017/02/20 Python
深入理解Python3中的http.client模块
2017/03/29 Python
对numpy的array和python中自带的list之间相互转化详解
2018/04/13 Python
Python3.6日志Logging模块简单用法示例
2018/06/14 Python
余弦相似性计算及python代码实现过程解析
2019/09/18 Python
Django 框架模型操作入门教程
2019/11/05 Python
WxPython实现无边框界面
2019/11/18 Python
基于Python下载网络图片方法汇总代码实例
2020/06/24 Python
澳大利亚最大的网上油画销售画廊:Direct Art Australia
2018/04/15 全球购物
艺术用品:Arteza
2018/11/25 全球购物
西安启天科技有限公司网络工程师面试题笔试题
2016/06/12 面试题
小学优秀教师材料
2014/12/15 职场文书
避暑山庄导游词
2015/02/04 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
通讯稿范文
2015/07/22 职场文书
MySQL Innodb关键特性之插入缓冲(insert buffer)
2021/04/08 MySQL