Django基础入门⑬:Django表单实例【表单应用】获取全量书籍信息

news2024/11/16 6:39:43

Django基础入门⑫:Django 对象查询详解,分组聚合

    • Django表单实例
      • 表单应用
        • 编写模板层HTML页面
        • 编写视图层逻辑代码
        • 配置url路由模式映射
        • 页面搜索效果展示
        • 表单验证逻辑
      • 获取全量书籍信息
      • 实现添加书籍信息

🏘️🏘️个人简介:以山河作礼。
🎖️🎖️:Python领域新星创作者,CSDN实力新星认证,阿里云社区专家博主,CSDN内容合伙人
🎁🎁:Web全栈开发专栏:《Web全栈开发》免费专栏,欢迎阅读!
🎁🎁:文章末尾扫描二维码可以加入粉丝交流群,不定期免费送书。


Django表单实例

表单应用

在页面中提交表单可以使用GET请求也可以使用POST请求,相应地,就可以通过 request.GET 或 request.POST 在视图中获取表单数据。

GET 和 POST 这两种 HTTP 请求类型用于不同的目的,对于改变系统状态的请求,如给数据表中添加一条记录,应该使用POST;而不改变系统状态的请求,如查询数据表的数据,应该使用 GET。大家应该对使用不同方式提交表单数据有深刻的认识。

编写模板层HTML页面

在templates/index中新建 search_title.html 文件,我们使用 GET 的方式进行查询。这时用户输入的查询 title 就会拼接在 url 中,它与 POST 最大的不同之处就在于,使用 POST 方式相对安全,对于一些私密信息比如说密码可以做到很好保护作用,还有就是 POST 将请求信息拼接在请求体中,和 GET 拼接在 url 中截然不同。所以对于这两种方法的选择,大家要根据具体的业务场景来进行选择。

代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍搜索页面</title>
</head>
<body>
<form action="/index/search_title/" method="get">
    <input type="text" name="title">
    <input type="submit" value="search_title">
</form>
</body>
</html>

编写视图层逻辑代码

注意此时 action 关联的 url 是用来显示查询结果的页面,表单中完成 url 的跳转就是使用 action 属性完成的。所以可以而知,在 index\views.py 中需要编写两个视图函数,其中一个用来显示查询页面,而另外一个视图用来显示查询结果。

代码分别如下所示:

from index.models import *

#用来显示查询页面
def search_title_form(request):
    return render(request,'index/search_title.html')
#用来显示查询结果
def serch_title(request):
    title=Book.objects.filter(title=request.GET['title']) 
    return render(request,'index/book_list.html',locals())

配置url路由模式映射

接下来配置路由映射关系,在此之前我们简单的编写一个查询结果页面,在 index\templates 中新建 book_list.html 页面,并在其中增加模板语言变量 {{ title }}。
然后如下如是配置路由关系:

from django.urls import path
from index import views
urlpatterns=[
    path('search_title_form/',views.search_title_form),
    path('search_title/',views.serch_title),
]

页面搜索效果展示

接下来,访问相应的 url 地址:127.0.0.1:8000\index\search_title_form\ 结果如下所示:

在这里插入图片描述

点击按钮,会得到如下所示结果:

在这里插入图片描述

表单验证逻辑

对于上述功能,还存在一些简单的问题,就是表单验证问题。在实际情况下用户可能没有输入查询关键词就单机搜索按钮,导致查询结果会出现错误。
所以在处理表单验证的问题上,有下面两点需要使用:

  • 表单页面没有错误提示,比如输入为空或者非法字符等;
  • 视图函数缺少校验逻辑,对于用户的输入没有做校验,比如输入是否为空。数据格式是否正确,类型是否满足规定条件;

解决上述问题只需要修改模板和视图函数的处理逻辑即可。

下面我们对上述代码进行一下修改,从而满足相应的验证逻辑。首先修改视图函数。

代码如下所示:

#修改视图函数
def search_title(request):
    if not request.GET.get('title', ''):
        errors = ['输入的书名是无效']
        #在这里使用列表的原因,是因为随着表单功能的修改可能需要传递多个字段,这时可能会有多个不同的错误信息需要展示。
        return render(request, 'index/search_title.html', locals())
    title=Book.objects.filter(title=request.GET['title'])
    return render(request, 'index/book_list.html', locals())

然后对模板search_title.html 进行修改,如下所示:

{%  if errors  %}
<ul>
    {% for error in errors %}
    <li>
        {{ error }}
    </li>
    {% endfor %}
</ul>
{% endif %}

当我们再访问 127.0.0.1:8000\index\search_title_form\ 时 ,并且在搜索框输入空值点击查询一下,就会得到如下页面显示:
在这里插入图片描述

获取全量书籍信息

将书籍的信息以表格的信息呈现的前端页面,通过页面中的的增加、删除按钮对表中的每条数据进行操作。这是本节要实现的主体功能。我们首先将书籍的信息按照表格的形式展现出来。
在 templates/index 中编写 book_table.html 页面。

代码如下所示:

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>书籍信息表</title>
</head>
<body>
<table border="1">
    <tr>
        <th>id</th>
        <th>title</th>
        <th>price</th>
        <th>retail_price</th>
        <th>public</th>
        <th>option</th>
    </tr>
    {% for book in all_book %}
    <tr>
        <td>{{ book.id }}</td>
        <td>{{ book.title }}</td>
        <td>{{ book.price }}</td>
        <td>{{ book.retail_price }}</td>
        <td>{{ book.pub.pubname }}</td>
        <td>
            <a href="/index/update_book/{{ book.id }}">更新</a>
            <a href="/index/delete_book/{{ book.id }}">删除</a>
        </td>
    </tr>
     {% endfor %}
    </table>
</body>
</html>

上述代码中我们我们构建了一个有关书籍信息表的表格,下面就需要在 index.views.py 文件中编写视图层代码逻辑了,代码如下所示:

def book_table(request):
    try:
        all_book=Book.objects.all().order_by('-price')
        if not all_book:
            return HttpResponse('书籍信息表为空,请录入!')
    except Exception as e:
        print(e)
    return render(request, 'index/book_table.html', locals())

并配置路由映射关系,最后访问 http://127.0.0.1:8000/index/all_book/ 可得如下界面显示:
在这里插入图片描述

实现添加书籍信息

接下来实现书籍信息的添加功能,编写 add_book.html 页面,代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>添加书籍信息</title>
</head>
<body>
    <form action="/index/add_book/" method="post">
    {% csrf_token %}
        <p>
           title : <input type="text" name="title">
        </p>
        <p>
           price : <input type="text" name="price">
        </p>
        <p>
            retail_price : <input type="text" name="retail_price">
        </p>
        <p>
            public : <input type="text" name="pub">
        </p>
        <p> 
        <!--按钮的值提交--> <input type="submit" value="提交"> 
        </p> 
    </form> 
</body>
</html>

上述我们编写完成了添加书籍信息的页面,然后需要在视图层 index\views.py 中编写提交书籍信息的逻辑代码。
如下所示:

def add_book(request):
    if request.method == 'GET':
        return render(request, 'index/add_book.html')
    elif request.method == 'POST':
        #添加书籍
        title = request.POST.get('title')
        if not title:
            return HttpResponse('请给出一个正确的title')
        pub = request.POST.get('pub')
        price = float(request.POST.get('price','999.99'))
        if not price:
            return HttpResponse('请输入价格')
        try:
            retail_price = float(request.POST.get('retail_price'))
            if not retail_price:
                return HttpResponse('请输入市场价')
        except Exception as e:
            print(e)
        #判断title是不是已经存在了
        old_book = Book.objects.filter(title=title)
        if old_book:
            return HttpResponse('你输入的书籍系统已经存在 !')
        try:
            pub1=PubName.objects.get(pubname=str(pub))
            Book.objects.create(title=title, price=price, retail_price=retail_price, pub=pub1)
        except Exception as e:
            print('Add ErrorReason is %s'%(e))
        return HttpResponseRedirect('/index/all_book')
    return HttpResponse('请使用正确Http请求方法 !')

最后将路由映射关系配置完成,通过上面的代码我们就完成书籍信息的添加的功能,访问 127.0.0.1/index/add_book,可得如下界面

在这里插入图片描述

输入完上述信息点击添加按钮,会自动跳转到图书浏览目录页面:
在这里插入图片描述

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

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

相关文章

jmeter的高阶使用技巧——打印时间戳与年月时分秒

Jmeter中提供了一种函数&#xff0c;可以打印时间戳&#xff0c;如下图 年&#xff1a; yyyy 月&#xff1a;MM 日&#xff1a;dd   时&#xff1a; HH 分&#xff1a; mm 秒&#xff1a;ss 关于时间戳的格式&#xff0c;可以自由组合定义&#xff0c;这里我写成这样 yyyy-M…

443端口被占用,vmware居然也来捣乱

今天搬砖时发现应用起不来了&#xff0c;显示出了熟悉的error *************************** APPLICATION FAILED TO START ***************************~~重点在这块哈 Description:Web server failed to start. Port 443 was already in use.Action:Identify and stop the p…

共创先进软件,驱动装备数字化——同元软控成功举办MWORKS 2023b产品发布会

6月30日&#xff0c;MWORKS 2023b产品发布会与Modelica暨装备数字化研讨会&#xff08;2023&#xff09;同期举行。继2023年1月8日发布MWORKS 2023a之后&#xff0c;年内第二个版本如期而至。MWORKS是苏州同元软控信息技术有限公司&#xff08;简称“同元软控”&#xff09;历时…

IPO观察丨烧钱7年、押注新药上市,来凯医药正在经历一场关键突围

医药板块的加速回升趋势越来越显著。据Choice数据显示&#xff0c;截至7月6日&#xff0c;7月以来医药相关ETF合计获净申购37.17亿份。拉长期限来看&#xff0c;2023年以来医药相关ETF合计获净申购637.06亿份。根据区间成交均价计算&#xff0c;今年以来有超300亿元资金流入医药…

DAY43:不同路径+不同路径Ⅱ(初始化注意点很多,及时复盘)

文章目录 62.不同路径&#xff08;注意初始化&#xff09;BFS深度搜索写法动态规划思路DP数组的含义递推公式DP数组初始化遍历顺序打印dp数组 动态规划写法数组越界的问题for循环执行的问题 63.不同路径Ⅱ&#xff08;初始化区别&#xff09;思路DP数组含义递推公式DP数组初始化…

武汉理工大学信息工程学院2023暑期学术夏令营|信息与通信工程方向

目录 武汉理工大学 校训&#xff1f; 1 通信系统的有效性和可靠性 2 关于QAM调制的问题 2.1 什么是调制 2.2 什么是载波调制 2.3 QAM原理 2.4 数字信号QAM调制 2.5 QAM如何实现&#xff1f; 3 看马路上行驶的车辆轮胎为什么倒转 “视觉暂留” 4 6G/4G/5G的经典技…

卫星数据下载指南

1、USGS Earth Explorer&#xff08;美国地质勘探局地球探测器&#xff09; EarthExplorer 2、Sentinel Open Access Hub https://scihub.copernicus.eu/dhus/#/home 3、NASA Earthdata Search&#xff08;美国航天局地球数据搜索&#xff09; https://search.earthdata.n…

构建新型电力系统,需要什么样的数字能源底座?

在迈向“碳中和”的进程中&#xff0c;全球能源产业变革已经进入了关键时期&#xff0c;其中电力系统的价值从未像今天这样重要。 国际能源署数据显示&#xff0c;2022年全球与能源相关的二氧化碳排放量超过368亿吨&#xff0c;创下历史新高。其中&#xff0c;电力领域碳排放占…

什么是热修复?它的优缺点是什么?

我们开发时常常要考虑的一些问题。 开发上线的版本能保证不存在Bug么&#xff1f; 修复后的版本能保证用户都及时更新么&#xff1f; 如何最大化减少线上Bug对业务的影响&#xff1f; 热修复技术帮助我们解决了很多问题&#xff0c;带来的优势不言而喻。不知道各位对于热修复技…

Qt关于mqtt多平台移植

最近写了很多mqtt相关的项目&#xff0c;但是在各个平台上编译mqtt的库成为了一个很麻烦的事情&#xff0c;每个平台都需要去编译一次&#xff0c;而且还会出现各种问题&#xff0c;为了方便解决这个问题&#xff0c;所以这里将mqtt库的代码以源代码的方式添加进去&#xff0c;…

Kafka 基础概念学习

基础概念学习 一.基础概念二.结构图 一.基础概念 Kafka 基本概念&#xff1a;一种分布式的&#xff0c;基于发布/订阅的消息系统项目ValueBrokerKafka服务端(即部署了Kafka的机器)Producer生产者写数据到主副本Consumer消费者从主副本读数据Consumer Group消费者组&#xff0c…

Apache Doris (二十二) :Doris Rollup物化索引作用及使用注意点

目录 1. Rollup 物化索引作用 1.1 改变索引 1.2 聚合数据 ​​​​​​​2. Rollup物化索引注意点 进入正文之前&#xff0c;欢迎订阅专题、对博文点赞、评论、收藏&#xff0c;关注IT贫道&#xff0c;获取高质量博客内容&#xff01; 宝子们点赞、收藏不迷路&#xff01;…

Stable Diffusion - 图像控制插件 ControlNet (OpenPose) 配置与使用

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/131591887 论文&#xff1a;Adding Conditional Control to Text-to-Image Diffusion Models ControlNet 是神经网络结构&#xff0c;用于控制预…

mybatis联查 字段重复问题 查询出来一致

联查的数据是不同&#xff0c;但是返回出来的数据是相同的 排查原因&#xff1a; 两个不同的实体类都有同一个字段code 解决办法&#xff1a; 在数据库字段column字段起个别名就可以

Spring 用注解更简单存取对象

Spring 用注解更简单存取对象 ​ 上一篇文章是最原始的创建使用&#xff0c;这篇主要是讲 Spring 更简单的存储和读取对象的核心是使用注解 ,也是日常生活企业用的最多的方法 “注解” 所以这篇的内容是很重要的 &#xff01;&#xff01;&#xff01; 文章目录 Spring 用注解…

基础篇--单片机简介

单片机简介 视频教程 单片机是什么 单片机&#xff1a;Single-Chip Microcomputer 单片微型计算机&#xff0c;是一种集成电路芯片 单片机有什么用&#xff1f; 单片机发展历程 单片机发展超势 CISC Vs RISC CISC和RISC举例 https://wenku.baidu.com/view/b074b0ed998fcc22b…

浅谈Acrel-2000电力监控系统在配电工程中的应用 安科瑞 许敏

摘 要&#xff1a;随着社会经济的快速发展&#xff0c;我国变电站正朝着现代化的方向不断发展&#xff0c;自动化设备以及继电保护装置凭借自身优异性能而获得广泛应用。本文介绍的AM5SE系列的微机保护装置&#xff0c;可以针对中原科技城智慧能源配电工程中不同保护对象提供对…

全志f1c200s嵌入式驱动开发(原理图)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 熟悉全志soc的同学都知道,除了v3s之外,其实还有很多性价比很高的soc。这里面就包含了f1c200s。之前的v3s,也就是我们所说的licheepi上面的soc,反响很不错。后期又出了一个liche…

【数据结构与算法】力扣:二叉树的层序遍历

给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 示例1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[[3],[9,20],[15,7]] 示例 2&#xff1a; 输入&a…

纷享销客携手新奥动力,赋能能源装备制造业企业增长再提速

近日&#xff0c;纷享销客与新奥能源动力科技&#xff08;上海&#xff09;有限公司&#xff08;以下简称&#xff1a;新奥动力&#xff09;售后数字化平台项目启动仪式在上海顺利召开&#xff0c;新奥动力和纷享销客双方多位高管共同出席了当天的启动会&#xff0c;双方就CRM建…