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 相关文章推荐
pandas Dataframe行列读取的实例
Jun 08 Python
Python pycharm 同时加载多个项目的方法
Jan 17 Python
解决PyCharm不运行脚本,而是运行单元测试的问题
Jan 17 Python
Python设计模式之简单工厂模式实例详解
Jan 22 Python
详解Python sys.argv使用方法
May 10 Python
python tkinter基本属性详解
Sep 16 Python
python中的逆序遍历实例
Dec 25 Python
python批量处理txt文件的实例代码
Jan 13 Python
装上这 14 个插件后,PyCharm 真的是无敌的存在
Jan 11 Python
Python内置数据结构列表与元组示例详解
Aug 04 Python
python自动化测试通过日志3分钟定位bug
Nov 20 Python
Python可视化神器pyecharts绘制水球图
Jul 07 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
日本十大惊悚动漫
2020/03/04 日漫
PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
2011/06/09 PHP
yii操作session实例简介
2014/07/31 PHP
使用WordPress发送电子邮件的相关PHP函数用法解析
2015/12/15 PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
2016/09/30 PHP
windows下的WAMP环境搭建图文教程(推荐)
2017/07/27 PHP
php使用json-schema模块实现json校验示例
2019/09/28 PHP
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
jquery 合并内容相同的单元格(示例代码)
2013/12/13 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
javascript数组遍历for与for in区别详解
2014/12/04 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
JQuery ztree带筛选、异步加载实例讲解
2016/02/25 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
vue滚动tab跟随切换效果
2020/06/29 Javascript
Nodejs在局域网配置https访问的实现方法
2020/10/17 NodeJs
从表单校验看JavaScript策略模式的使用详解
2020/10/17 Javascript
Python使用smtp和pop简单收发邮件完整实例
2018/01/09 Python
Python实现的读取电脑硬件信息功能示例
2018/05/30 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python树的同构学习笔记
2019/09/14 Python
Pytorch实现基于CharRNN的文本分类与生成示例
2020/01/08 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
美国最流行的男士时尚网站:Touch of Modern
2018/02/05 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
打造高效课堂实施方案
2014/03/22 职场文书
八项规定对照检查材料
2014/08/31 职场文书
大学生学年个人总结
2015/02/15 职场文书
2015年禁毒宣传活动总结
2015/03/25 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
一篇文章看懂MySQL主从复制与读写分离
2021/11/07 MySQL