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 输出上个月的月末日期实例
Apr 11 Python
解决python nohup linux 后台运行输出的问题
May 11 Python
利用Python进行数据可视化常见的9种方法!超实用!
Jul 11 Python
解决python xlrd无法读取excel文件的问题
Dec 25 Python
pyqt 实现为长内容添加滑轮 scrollArea
Jun 19 Python
解决pycharm不能自动保存在远程linux中的问题
Feb 06 Python
Python 图片处理库exifread详解
Feb 25 Python
python Autopep8实现按PEP8风格自动排版Python代码
Mar 02 Python
python 如何读、写、解析CSV文件
Mar 03 Python
python迷宫问题深度优先遍历实例
Jun 20 Python
Python+Matplotlib+LaTeX玩转数学公式
Feb 24 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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
在DC的漫画和电影中,蝙蝠侠的宿敌,小丑的真名是什么?
2020/04/09 欧美动漫
简单了解PHP编程中数组的指针的使用
2015/11/30 PHP
PHP内存缓存功能memcached示例
2016/10/19 PHP
Extjs TimeField 显示正常时间格式的代码
2011/06/28 Javascript
获取body标签的两种方法
2011/10/13 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
快速解决jQuery与其他库冲突的方法介绍
2014/01/02 Javascript
jQuery之ajax删除详解
2014/02/27 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
jQuery中contents()方法用法实例
2015/01/08 Javascript
JavaScript使用slice函数获取数组部分元素的方法
2015/04/06 Javascript
jquery动画效果学习笔记(8种效果)
2015/11/13 Javascript
WebSocket+node.js创建即时通信的Web聊天服务器
2016/08/08 Javascript
Javascript将JSON日期格式化
2016/08/23 Javascript
bootstrap多种样式进度条展示
2016/12/20 Javascript
使用vuex的state状态对象的5种方式
2018/04/19 Javascript
webpack dll打包重复问题优化的解决
2018/10/10 Javascript
Webpack中loader打包各种文件的方法实例
2019/09/03 Javascript
[01:08:43]DOTA2-DPC中国联赛定级赛 Phoenix vs DLG BO3第一场 1月9日
2021/03/11 DOTA
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python六大开源框架对比
2015/10/19 Python
Python3连接MySQL(pymysql)模拟转账实现代码
2016/05/24 Python
使用Python对Excel进行读写操作
2017/03/30 Python
Python数据可视化正态分布简单分析及实现代码
2017/12/04 Python
Python3.5实现的三级菜单功能示例
2019/03/25 Python
python线程中的同步问题及解决方法
2019/08/29 Python
python二元表达式用法
2019/12/04 Python
抽象类和接口的区别
2012/09/19 面试题
贺卡寄语大全
2014/04/11 职场文书
新品发布会策划方案
2014/06/08 职场文书
西柏坡导游词
2015/02/05 职场文书
电影地道战观后感
2015/06/04 职场文书
《搭石》教学反思
2016/02/18 职场文书
《小蝌蚪找妈妈》教学反思
2016/02/23 职场文书