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装饰器与递归算法详解
Feb 18 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
python 删除大文件中的某一行(最有效率的方法)
Aug 19 Python
PyCharm鼠标右键不显示Run unittest的解决方法
Nov 30 Python
python字符串循环左移
Mar 08 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
May 27 Python
利用python实现周期财务统计可视化
Aug 25 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
new_zeros() pytorch版本的转换方式
Feb 18 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
python unichr函数知识点总结
Dec 16 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
windows下开发并编译PHP扩展的方法
2011/03/18 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
2013/11/12 PHP
PHP内存缓存Memcached类实例
2014/12/08 PHP
thinkPHP中多维数组的遍历方法
2016/01/09 PHP
PDO::setAttribute讲解
2019/01/29 PHP
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
2011/09/26 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
Select2.js下拉框使用小结
2016/10/24 Javascript
Javascript 获取鼠标当前的位置实现方法
2016/10/27 Javascript
js获取元素下的第一级子元素的方法(推荐)
2017/03/05 Javascript
使用angular帮你实现拖拽的示例
2017/07/05 Javascript
input输入框内容实时监测(附代码)
2017/08/15 Javascript
vue组件watch属性实例讲解
2017/11/07 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
使用canvas实现一个vue弹幕组件功能
2018/11/30 Javascript
vue设置一开始进入的页面教程
2019/10/28 Javascript
vue 实现锚点功能操作
2020/08/10 Javascript
python用于url解码和中文解析的小脚本(python url decoder)
2013/08/11 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
python图书管理系统
2020/04/05 Python
Python 中包/模块的 `import` 操作代码
2019/04/22 Python
python字符串中匹配数字的正则表达式
2019/07/03 Python
python中selenium操作下拉滚动条的几种方法汇总
2019/07/14 Python
Django中间件拦截未登录url实例详解
2019/09/03 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
在tensorflow下利用plt画论文中loss,acc等曲线图实例
2020/06/15 Python
树莓派4B安装Tensorflow的方法步骤
2020/07/16 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
伦敦一卡通:The London Pass
2018/11/30 全球购物
领导干部廉政自律承诺书
2014/05/26 职场文书
交通安全标语
2014/06/06 职场文书
感谢信范文大全
2015/01/23 职场文书
文艺有韵味的诗句(生命类、亲情类...)
2019/07/11 职场文书
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
SQL语句中JOIN的用法场景分析
2021/07/25 SQL Server
Vue的生命周期一起来看看
2022/02/24 Vue.js