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

news2024/11/27 0:20:20

        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,否 则为 FalseTrue 或 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()
    values
    html = []
    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']=result
        except:
            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':                #这里要注意确认一下方法为POST
        form = 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:
                pass
            for 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']=results
            return 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类真的很方便。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4140.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL中SQL命令语句条件查询

一、聚合函数 聚合函数&#xff1a;又叫组函数&#xff0c;用来对表中的数据进行统计和计算&#xff0c;结合group by分组使用&#xff0c;用于统计和计算分组数据 常用聚合函数 count(col)&#xff1a;求指定列的总行数max(col)&#xff1a;求指定列的最大值min(col)&#…

SnowNLP使用自定义语料进行模型训练(情感分析)

SnowNLP SnowNLP是一个功能强大的中文文本处理库&#xff0c;它囊括了中文分词、词性标注、情感分析、文本分类、关键字/摘要提取、TF/IDF、文本相似度等诸多功能&#xff0c;像隐马尔科夫模型、朴素贝叶斯、TextRank等算法均在这个库中有对应的应用。如果大家仔细观察过博主的…

nodejs的下载安装

1.从官网下载nodejs 官网地址如下 Download | Node.js 选择老版本的node防止出现兼容问题 根据电脑下载64位或者32位的 2.安装node 配置环境变量&#xff0c;nodejs安装完成后&#xff0c;会默认在系统path环境变量中配置node.exe的路径&#xff0c;打开cmd&#xff0c;输入n…

Java实现DFA算法进行敏感词过滤

一、敏感词过滤数据文件 https://github.com/jkiss/sensitive-words 代码图数据文件如下&#xff1a; 二、敏感词实现原理基于二叉树排序 首先&#xff1a;query 日 ---> {本}、query 本 --->{人、鬼子}、query 人 --->{null}、query 鬼 ---> {子}。形如下结构&…

见微知著,从两道有意思的 CSS 面试题,考察你的基础

今天在论坛&#xff0c;有看到这样一道非常有意思的题目&#xff0c;简单的代码如下&#xff1a; <div><p id"a">First Paragraph</p> </div> 样式如下&#xff1a; p#a {color: green; } div::first-line {color: blue; } 试问&#xff0…

手写笔记教会你集成Spring和Mybatis框架(有详细注解)

目录 1. 为什么要将框架进行集成呢&#xff1f; 2. 框架的集成有什么好处&#xff1f; 3. Spring框架与Mybatis框架的集成 3.1 步骤一&#xff1a; 3.2 步骤二 3.3 Spring的配置文件&#xff1a; 3.4 Mybatis的配置文件&#xff1a; 4. 总结 1. 为什么要将框架进行集成…

基于51单片机智能恒温箱控制系统Proteus仿真

资料编号&#xff1a;153 下面是相关功能视频演示&#xff1a; 153-基于51单片机智能恒温箱控制系统Proteus仿真(源码仿真全套资料)功能介绍&#xff1a; 采用51单片机作为控制CPU&#xff0c;ds18b20作为温度传感器采集温度&#xff0c;LCD1602显示当前温度&#xff0c;采用…

【Yarn】spark/flink 作业的executor内存参数和Yarn web ui 显示不一致问题

前言 最近在做 CDH -> CDP 的迁移&#xff0c;Yarn迁移完成后&#xff0c;发现在spark/flink 作业的executor内存参数和Yarn web ui 显示申请的内存不一致。 例如&#xff1a;一个 spark 任务申请了 10个 executor&#xff0c;每个executor 内存为 1G&#xff0c;driver内…

董秋仙-1-函数极限连续-2

目录 利用单调有界原理求数列收敛&#xff0c;主要分为两步 利用切线放缩和定积分放缩 拆成两个调和级数相减拉链定理 使用诱导公式转化为可以使用等价无穷小的情形 无穷区间零点定理的取点 证明数列收敛有四种方法 证明调和级数发散的方法 利用单调有界原理求数列收敛&…

Docker专题(五)之 端口映射与容器互联

文章目录一、端口映射实现容器访问1.1 从外部访问容器的应用1.2 映射所有接口的地址1.3 映射到指定地址的指定端口1.4 映射到指定地址的任意端口1.5 查看映射端口配置二、互联机制实现便捷访问2.1自定义容器命名2.2 容器互联Docker除了通过网络来访问外&#xff0c;还提供了两个…

网络是怎样连接的--探索协议栈和网卡

“如果一生只有一次翻身的机会&#xff0c;那就用尽全力吧。” 文章目录1.创建套接字1.1 协议栈的内部结构1.2 套接字的实体就是通信控制信息1.3 调用socket时的操作2.连接服务器2.1连接含义2.2 负责保存控制信息的头部2.3 连接操作的实际过程3.收发数据3.1将http请求消息交给协…

JavaScript | 1000个判断条件难道要写了1000个 if ? 一文教你如何实现分支优化

&#x1f9d1;‍&#x1f4bc; 个人简介&#xff1a;大三学生&#xff0c;一个不甘平庸的平凡人&#x1f36c; &#x1f5a5;️ NodeJS专栏&#xff1a;Node.js从入门到精通 &#x1f5a5;️ 博主的前端之路&#xff08;源创征文一等奖作品&#xff09;&#xff1a;前端之行&am…

K线形态识别_身怀六甲和十字胎

写在前面&#xff1a; 1. 本文中提到的“K线形态查看工具”的具体使用操作请查看该博文&#xff1b; 2. K线形体所处背景&#xff0c;诸如处在上升趋势、下降趋势、盘整等&#xff0c;背景内容在K线形态策略代码中没有体现&#xff1b; 3. 文中知识内容来自书籍《K线技术分析》…

双非本计算机从零开始三年努力能做到什么程度【学习路线回顾总结问答】

文章目录前言一、回顾大学1.1 大一上1.1.1 第一个学期1.1.2 第一个寒假1.2 大一下1.2.1 第二个学期1.2.2 第一个暑假1.3 大二上1.3.1 第三个学期1.3.2 第二个寒假1.4 大二下1.4.1 第四个学期1.4.2 第二个暑假1.5 大三上1.5.1 第五个学期1.5.2 第三个寒假1.6 大三下1.6.1 第六个…

3.1 机器学习 --- 决策树

3.1 机器学习 — 决策树 一 金融评分卡 模型做好后尽量快的上线&#xff0c;以符合要求的模型&#xff0c;尽快上线。超参数赋予权重&#xff0c;使得模型的参数不一致&#xff0c;而达到均衡样本数据 二 决策树原理 1. 找女朋友 性别&#xff1a;男 女年龄&#xff1a;20…

二叉树跟前缀、中缀、后缀表达式

目录 一.概念 二.跟二叉树的联系 前序遍历&#xff08;先根遍历&#xff09; 中序遍历&#xff08;中根遍历&#xff09; 后序遍历&#xff08;后根遍历&#xff09; 二叉树例题 三.知二求一并还原二叉树 已知前序遍历和中序遍历 例题 解答 已知中序遍历和后序遍历 …

【双十一特辑】爱心代码(程序员的浪漫)

个人主页&#xff1a;天寒雨落的博客_CSDN博客-C,CSDN竞赛,python领域博主 目录 前言 C语言简易爱心代码 原理 代码 执行结果 C语言动态爱心代码 涉及知识点 SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),字体色) sheep() 代码 执行结果 Python简易爱…

c++数据结构第六周(图),深搜、广搜(stl版)

本方法皆用vector进行邻接表模拟 7-1 图的先深搜索 作者 唐艳琴 单位 中国人民解放军陆军工程大学 输出无向图的给定起点的先深序列。 输入格式: 输入第一行给出三个正整数&#xff0c;分别表示无向图的节点数N&#xff08;1<N≤10&#xff09;、边数M&#xff08;≤50&a…

CentOS7.x部署GreenPlum6.x

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、GreenPlum是什么&#xff1f;二、使用步骤1.环境说明2.集群介绍3.修改主机名(root)4.网络映射(root)5.创建安装目录6.安装部署7.SSH (免密登录)8.环境配置9.…

【SOLIDWORKS学习笔记】制作小风扇摇头底座(下)--- 细节优化

介绍&#xff1a;俗话说的好&#xff0c;电控决定机器人下限&#xff0c;机械决定机器人上限。作为一个在电控领域摸打滚爬了三年的选手&#xff0c;一直非常心动那些酷炫的机械模型&#xff0c;但是一直以来只能做甲方给别人提需求&#xff0c;做不到自己动手实现。所以我打算…