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使用Image处理图片常用技巧分析
Jun 01 Python
python字符串str和字节数组相互转化方法
Mar 18 Python
Python算术运算符实例详解
May 31 Python
python绘制热力图heatmap
Mar 23 Python
对python mayavi三维绘图的实现详解
Jan 08 Python
Python3连接Mysql8.0遇到的问题及处理步骤
Feb 17 Python
python针对Oracle常见查询操作实例分析
Apr 30 Python
python构造IP报文实例
May 05 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
python搜索算法原理及实例讲解
Nov 18 Python
用python自动生成日历
Apr 24 Python
jupyter notebook保存文件默认路径更改方法汇总(亲测可以)
Jun 09 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
Zend Studio去除编辑器的语法警告设置方法
2012/10/24 PHP
php实现获取及设置用户访问页面语言类
2014/09/24 PHP
变量在 PHP7 内部的实现(一)
2015/12/21 PHP
原生php实现excel文件读写的方法分析
2018/04/25 PHP
学习ExtJS form布局
2009/10/08 Javascript
页面版文本框智能提示JS代码
2009/11/20 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
Jquery插件之Fancybox丰富的弹出层效果附源码下载
2015/12/02 Javascript
jQuery EasyUI之DataGrid使用实例详解
2016/01/04 Javascript
jQuery Validate验证框架详解(推荐)
2016/12/17 Javascript
JavaScript用构造函数如何获取变量的类型名
2016/12/23 Javascript
angularjs中ng-attr的用法详解
2016/12/31 Javascript
nodeJS实现简单网页爬虫功能的实例(分享)
2017/06/08 NodeJs
jquery图片放大镜效果
2017/06/23 jQuery
微信小程序实现跑马灯效果完整代码(附效果图)
2018/05/30 Javascript
Vue+Express实现登录注销功能的实例代码
2019/05/05 Javascript
微信小程序基于Taro的分享图片功能实践详解
2019/07/12 Javascript
微信小程序实现蒙版弹出窗功能
2019/09/17 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
零基础写python爬虫之urllib2中的两个重要概念:Openers和Handlers
2014/11/05 Python
python查看微信好友是否删除自己
2016/12/19 Python
对tf.reduce_sum tensorflow维度上的操作详解
2018/07/26 Python
Pandas GroupBy对象 索引与迭代方法
2018/11/16 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
Pycharm保存不能自动同步到远程服务器的解决方法
2019/06/27 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
python__new__内置静态方法使用解析
2020/01/07 Python
使用Python爬虫库requests发送请求、传递URL参数、定制headers
2020/01/25 Python
浅析python连接数据库的重要事项
2021/02/22 Python
美国顶级防滑鞋:Shoes For Crews
2017/03/27 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
个人找工作自荐信格式
2013/09/21 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
「魔导具师妲莉亚永不妥协~从今天开始的自由职人生活~」1、2卷发售宣传CM公开
2022/03/21 日漫
Python实现数据的序列化操作详解
2022/07/07 Python