HTML 表单是交互式网站的基本组成部分,用户提交信息、搜索内容、与后台数据交互都要用到表单。

1、从请求对象中获取数据

view视图函数的第一个参数都是 request,这个request就是请求获得的HttpRequest对象。里面包含中有一些关于当前所请求 URL 的信息,如下图

HttpRequest对象的方法和属性
属性/方法 说明 示例
request.path 完整的路径,不含域名,但是包 含前导斜线 “/hello/”
request.get_host() 主机名(即通常所说的“域名”) “127.0.0.1:8000”或www.newweb.com
request.get_full_path() 包含查询字符串(如果有的话) 的路径 “/hello/?print=true”
request.is_secure() 通过 HTTPS 访问时为 True,否 则为 False True 或 False

2、关于请求的其他信息

request.META 的值是一个 Python 字典,包含请求的所有 HTTP 首部,例如用户的 IP 地址和用户代理(user agent,通常是 Web 浏览器的名称和版本)。

注意,具体包含哪些首部取决于用户发送了什么首部,以及 Web 服务器返回了什么首部。

这个字典中常见的几个键有:

• HTTP_REFERER:入站前的 URL(可能没有)。(注意,要使用错误的拼写,即 REFERER。)

• HTTP_USER_AGENT:浏览器的用户代理(可能没有)。例如:"Mozilla/5.0 (X11; U; Linux i686; frFR; rv:1.8.1.17) Gecko/20080829 Firefox/2.0.0.17"。

• REMOTE_ADDR:客户端的 IP 地址,例如 "12.345.67.89"。(如果请求经由代理,这个首部的值可能是一 组 IP 地址,以逗号分隔,例如 "12.345.67.89,23.456.78.90"。)

注意,因为 request.META 是个普通的 Python 字典,所以尝试访问不存在的键时,抛出 KeyError 异常。 (HTTP 首部是外部数据,即由用户的浏览器提交,因此不能完全相信,当某个首部为空或不存在时,应该让应用程序优雅失败。)为了处理未定义的键,应该使用 try/except 子句,或者 get() 方法:

# 用try语句
def ua_display_good1(request):try:useragent = request.META['HTTP_USER_AGENT']except KeyError:useragent = 'unknown'return HttpResponse("Your browser is %s" % useragent)# 用get方法
def ua_display_good2(request):useragent = request.META.get('HTTP_USER_AGENT', 'unknown')return HttpResponse("Your browser is %s" % useragent)

也可以编写一个简单的视图,显示 request.META 中的所有信息,以便查阅。

def display_meta(request):values = request.META.items()valueshtml = []for k, v in values:html.append('<tr><td>%s</td><td>%s</td></tr>' % (k, v))return HttpResponse('<table>%s</table>' % '\n'.join(html))

3、用表单实现查询功能

除了关于请求的基本元数据之外,HttpRequest 对象还有两个属性包含用户提交的信息:request.GET 和 request.POST。这两个属性的值都是类似字典的对象,分别用于获取 GET 和 POST 数据。POST 数据一般由 HTML 表单提交,而 GET 数据既可以来自表单,也可以来自页面 URL 中的查询字符串。

我们利用request.GET 和 request.POST就可以实现前后端之间的通信,让用户提交的信息传递给服务器,服务器进行响应。

我们前面的案例中说到可以用url传输信息给后端,但那不是个好办法,现在我们改用表单传输数据,实现查询功能。我们先在之前的 'notice/'  url 对应的 class3.html 增加一个查询表单(纯属偷懒,表单应该放到页面合适的地方去)

<form action="/search/" method="get"><h3>根据姓名查找同学</h3>
<input type="text" name="chaxun">
<input type="submit" value="查询">
</form>

这里 method = ‘get’表示请求的方法为  get

<h3>这一行是标题,告诉用户这个表单是干嘛的,应该填什么数据,可要可不要

第一个input 的 name='chaxun' 这是后面我们找数据是要用到的标签名称

第二个input 的 type = 'submit' 表示这是一个提交按钮,value='查询' 表示它在页面上显示为“查询”

看一下页面:

然后我们来写个视图函数 chaxun1

def chaxun1(request):studentName = request.GET['chaxun']s = Student.objects.get(name=studentName)return HttpResponse('你要查询的{}同学信息如下:姓名:{},年龄{},性别{},成绩{},武力值{}'.format(s.name,s.name,s.age,s.sex,s.score,s.skill))

然后我们在上面的文本框中输入 “黄蓉”,点击查询按钮,得到如下结果:

4、改进表单

上面这个表单虽然实现了我们预期的功能,但是还不完善。比如如果用户提交的是个空表单怎么办,如果用户提交的信息数据库里查不到怎么办,我们不能总是报错啊,现在我们来着手改进这个表单:

if request.GET and request.GET['chaxun']:             #确保GET方法获得了值,并且'chaxun'标签(就是那个提交查询内容的输入框)不为空studentName = request.GET['chaxun']try:                                              #确保要查询的数据存在s = Student.objects.get(name=studentName)result = '你要查询的{}同学信息如下:姓名:{},年龄{},性别{},成绩{},武力值{}'.format(s.name,s.name,s.age,s.sex,s.score,s.skill)context['result']=resultexcept:context['result']='查无此人'                   #如果查不到,显示“查无此人”并返回同一个页面return render(request,'class3.html',context=context,status=200)else:                                                 #如果输入为空,曾刷新页面,重新填写return render(request, 'class3.html')

这样改造后,我们再查询页面,就可以直接看到结果了,输入空值则会返回当前页面继续填写

5、Django的表单类

用户在填写表单的时候,谁也不知道用户会写些什么,为了数据能够按规范填写,就需要对用户的填写行为进行约束,也就是表单的验证。我们当然可以自己手动去写这些验证方法,不过Django已经贴心地为我们准备好了内置的表单库,django.forms,它能处理从显示 HTML 表单到验证的大多数问题,即开即用。

我们用一个例子来演示一下这个表单类怎么用。比如上面那个查询功能,我们现在用forms表单类把它集成实现。

首先新建一个forms.py文件(当然也可以直接写在views.py,不过一般Django风格都是给forms单独一个文件)我们定义一下我们需要的字段。这里的字段其实是显示在前端给用户看的,所以想要让用户输入什么字段,就在这里定义,比如我们这里打算让用户可以通过 姓名、年龄 和 成绩这三个条件来查询:

from django import forms                          #注意这里要从django引入forms库
class chaxunForm(forms.Form):                     #定义一个查询类#这里label就是前端显示的输入框的提示文字,max_length是输入的最大长度,#required=False是允许这个值为空,因为我们期望的是通过每个条件单独都可以查询name = forms.CharField(label="名字",max_length=10,required=False)         #这里可以定义输入数值的大小,用max_value  和 min_value 参数来设定上下限age = forms.IntegerField(label="年龄",required=False,max_value=100,min_value=10)score = forms.IntegerField(label="成绩",required=False)

为了方便演示,我们另外写了个HTML页面文件 chaxun.html,反正用模板继承很方便

{% extends "base.html" %}
{% block title %}武侠三班的小窝{% endblock %}{% block main %}
<h1>查询页面,在这里可以查找你想了解的同学</h1><form action="" method="post">{% csrf_token %}<h3>根据条件查找同学</h3>{{form}}<input type="submit" value="查询">
</form><P>{% for result in results %}
<div>{{result}}</div>{% endfor %}
</P>{% endblock %}

注意这里页面上的输入框不用我们自己手动写了,form类会自动把自定义的字段转成input输入框  然后我们去views.py调用这个类,

from classManage.forms import chaxunForm
........
#其他代码
........
def chaxun4(request):context={}form=chaxunForm(request.POST) if request.method == 'POST':                #这里要注意确认一下方法为POSTform = chaxunForm(request.POST)         #实例化一个我们在forms.py里面定义的chaxunForm类context['form']=form                    #把form实例赋值给字典的 'form',方便前端调用results = []if form.is_valid():                     #确保form的数据有效,这个验证工作forms类帮我们做了stuName = form.cleaned_data.get('name')      #cleaned_data是经过清洗的数据  stuAge = form.cleaned_data.get('age')print(stuAge)if stuName:#名字一般是唯一的,但是为了上下统一用一个函数比较方便,我们统统用filter,而不是get,然后把数据放到一个列表中去遍历stus=Student.objects.filter(name=stuName) elif stuAge:stus=Student.objects.filter(age=stuAge)elif stuScore: stus=Student.objects.filter(score=stuScore)else:passfor s in stus:result = '你要查询的{}同学信息如下:姓名:{},年龄{},性别{},成绩{},武力值{}'.format(s.name,s.name,s.age,s.sex,s.score,s.skill)results.append(result)print('postresult:',results)context['results']=resultsreturn render(request,'class3.html',context=context,status=200)else:form = chaxunForm()context['form']=form              #把form对象整个赋值给字典的 'form'方便前端调用return render(request,'chaxun.html',context=context,status=200)

我们去访问页面 http://127.0.0.1:8000/cha/ 看看效果

可以看到出现了 名字、年龄、成绩 三个查询框,我们任意填其中一个,实现查询功能

我们测试一下forms的验证效果,我们在年龄框里面输入汉字,发现根本不给输入,然后我们在年龄这里输入数字5,点击查询后发现它提示我数字必须大于10:

当然这里这个提示不太美观,可以自定义来定制验证信息。总之,forms类可以帮我们进行数据审查,比如如果我们定义了一个forms类的email字段,它会自动审查输入是否为一个email格式,这真的大大简化了我们的工作啊。

所以我们一般做登录、注册表单或者信息提交表单的时候,用这个forms类真的很方便。

<学习笔记>从零开始自学Python-之-web应用框架Django( 八)Django表单相关推荐

  1. extjs 提交表单给php,JavaScript_Extjs学习笔记之二 初识Extjs之Form,Extjs中的表单组件是Ext.form.Basic - phpStudy...

    Extjs学习笔记之二 初识Extjs之Form Extjs中的表单组件是Ext.form.BasicForm,不过最简单最常用的是Ext.form.FormPanel控件,它继承自Panel,具有一 ...

  2. python创建虚拟环境_Python学习笔记:创建Python开发Web程序的虚拟环境

    学习Excel技术,关注微信公众号: excelperfect 这段时间利用业余时间在断断续续地看Eric Matthes著的<Python编程从入门到实践>这本书,毫不夸张地说,这真的是 ...

  3. 超级详细的Python程序设计学习笔记,适合Python二级备考和自学Python的小白(me too)

    超级详细的Python学习笔记,适合Python二级备考和自学Python的小白(me too). 写作不易,喜欢的话点个赞吧

  4. 自学python方法-从零开始自学python编程,你找对方法了吗?

    原标题:从零开始自学python编程,你找对方法了吗? 适合初学者入门 其实python非常适合初学者入门.相比较其他不少主流编程语言,有更好的可读性,因此上手相对容易.自带的各种模块加上丰富的第三方 ...

  5. (Python入门)学习笔记二,Python学习路线图

    (Python入门)学习笔记二,Python学习路线图 千里之行始于足下,谋定而后动,冰冻三尺非一日之寒.之所以说这三句话,就是对于下面整理的路线图,即不让自己感觉路途的遥远而感到达到巅峰神界的遥遥无 ...

  6. python3.4学习笔记(二十一) python实现指定字符串补全空格、前面填充0的方法

    python3.4学习笔记(二十一) python实现指定字符串补全空格.前面填充0的方法 Python zfill()方法返回指定长度的字符串,原字符串右对齐,前面填充0. zfill()方法语法: ...

  7. Python学习笔记:使用Python操作数据库

    Python学习笔记:使用Python操作数据库 一.数据库编程接口 为了对数据库进行统一的操作,大多数语言都提供了简单的.标准化的数据库接口(API).在Python Database API 2. ...

  8. 数据结构学习笔记:利用Python列表实现栈结构

    数据结构学习笔记:利用Python列表实现栈结构 利用Python列表实现栈结构.有两种实现方式: 1.将列表的末尾(rear)作为栈顶(top) 2.将列表的前端(front)作为栈顶(top) 一 ...

  9. Python学习笔记:用Python获取数据(本地数据与网络数据)

    Python学习笔记:用Python获取数据(本地数据与网络数据) 一.用Python获取本地数据 读写文件(三种基本模式:r, w, a) 1.写文件 2.读文件

  10. python学习笔记26(python中__name__的使用)

    python学习笔记26(python中__name__的使用) 在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以imp ...

最新文章

  1. 数据港:攻破OPEX+SLA难题,实现全生命周期效能管理
  2. 计算机控制系统第三次作业,计算机组成与系统结构第三次作业
  3. python装饰器 property_python中property和setter装饰器用法
  4. 手机刷的面具是什么_从刷入到跑路-Magisk(面具)刷入使用教程
  5. 设计模式(一)Chain Of Responsibility责任链模式
  6. 【洛谷P3369】 (模板)普通平衡树
  7. python运算符手写笔记_Python笔记(四)-运算符
  8. Win11怎么设置鼠标箭头图案?Win11更换鼠标图案的方法
  9. Stanford Algorithms: Design and Analysis, Part 1 [Final Exam]
  10. Linux openwrt 树莓派 香蕉派 嵌入式 usb 声卡 PCM2704 2705 2706 CM108 PCM2704/2705/2706 linux专用声卡 专用usb声卡
  11. h5案例分享:王中军个人画展:藝術東西,玄如藝術
  12. *p++、*(p++)、(*p)++、*++p、++*p的区别
  13. 51单片机入门——Keil uVision4的使用
  14. win10系统升级没有声音?老司机教你怎么重新安装声卡驱动
  15. 农夫山泉有点牛!港股打新把暗盘系统都整崩溃了
  16. 如何实现监控视频RTSP流在网页中低延时播放
  17. 2022-2027年中国海洋功能性食品行业发展监测及投资战略研究报告
  18. Codeforces ~ 990A ~ Commentary Boxes (水)
  19. C语言给出点坐标进行克里金插值,Arcgis笔记之克里金插值——求助surfer8.0
  20. Firefox插件导航

热门文章

  1. 费马小定理 欧拉定理 逆元
  2. 如何在Python中使用Rest API
  3. 程序员30+后的困惑焦虑,出路在哪里?
  4. Java RESTful风格编程 和 RESTful架构详解
  5. 左耳朵耗子:从“打工人”到技术创业者,我是如何作死的
  6. 数学不好可以学计算机科学吗,数学不好可以学习计算机专业吗?
  7. 计算机简史:你想不通去脉,是因为不了解来龙
  8. 无需输入密码,XP自动登录域
  9. 电脑桌面美化教程,强迫症福利
  10. 中文编程语言——易语言,到底是用来干什么的?易语言值得学习吗?易语言的优势有什么?