22-Django框架基础

news/2024/10/24 0:24:55/

1 实现更新书籍信息

更改原有的书籍信息也是经常用到的功能,比如价格的调动等,那么下面就来实现这个功能,首先还是编写模板层页面,在 templates/index 中新建 update_book.html 页面,代码所下所示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>更新书籍表</title>
</head>
<body>
<form action="/index/update_book/{{ book.id }}" method="post">{% csrf_token %}
<!--    css3 disabled属性 不可选状态/禁用元素--><p>书籍名:<input type="text"  value="{{ book.title }}" disabled="disabled"></p><p>零售价:<input type="text" value="{{ book.price }}" name="price"></p><p>市场价:<input type="text" name="retail_price" value="{{ book.retail_price }}"></p><p>出版社:<input type="text" value="{{ book.pub.pubname }}" disabled="disabled"></p><p><input type="submit" value="提交"></p>
</form>
</body>
</html> 

上述完成了update_book.html页面的编写,我们使用了CSS3的disabled属性,将 title 和 public 置于不可选择的状态,只允许修改零售价与市场价。接下来我们在 index\views.py 中编写视图层代码:

def update_book(request, book_id):#用 book_id给每个书籍加上标记#将其作为查找书籍的参数book_id = int(book_id)try:book = Book.objects.get(id=book_id)except Exception as e:return HttpResponse('--没有找到任何书籍---')if request.method == 'GET':return render(request, 'index/update_book.html', locals())elif request.method == 'POST':price = request.POST.get('price')retail_price = request.POST.get('retail_price')if not price or not retail_price:return HttpResponse('请输入更改后的零售价或市场价!')price = float(price)retail_price = float(retail_price)# 修改对象属性值book.price = pricebook.retail_price = retail_price# 存储更新后的状态book.save()#重定向至127.0.0.1:8000/index/all_book/return HttpResponseRedirect('/index/all_book')return HttpResponse("书籍信息更新功能")

上述的代码中我们使用了动态URL的方式,book_id 作为动态参数起到了关联每个书籍条目的作用,每个书籍条目都具有唯一性的 id,这里选择它作为参数再合适不过了,最后我们要完成动态路由的配置,如下所示:

urlpatterns=[path('update_book/<int:book_id>',views.update_book)
]

在浏览器地址栏输入 127.0.0.1:8000/index/update_book/5 直接可以进入,书籍价格的修改页面,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IhwOBd8Y-1683382110062)(imgs\企业微信截图_20230505153239.png)]

然后修改市场价也为 70.00,并提交数据,url 会自动跳转至 127.0.0.1:800/index/all_book/ 页面,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XmOGR3wM-1683382110064)(imgs\企业微信截图_20230505153800.png)]

2 实现删除书籍条目信息

现在实现本项目实例的最后一个功能,即书籍条目的删除功能,我相信大家已经可以独立完成删除功能了,不过我们还是要给出代码,大家可以参照一下。首先还是在 templates/index 中新建 delete_book.html 页面,代码如下所示:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>删除书籍条目</title><style>input:not([type="submit"]){border:1px solid blue;}input[type="submit"]{background:red;}</style>
</head>
<body>
<form action="" method="post">{% csrf_token %}<p>书籍名:<input type="text"  value="{{ book.title }}" name="title"></p><p>零售价:<input type="text" value="{{ book.price }}" name="price"></p><p>市场价:<input type="text" name="retail_price" value="{{ book.retail_price }}"></p><p>出版社:<input type="text" value="{{ book.pub.pubname }}" name="pub"></p><p><input type="submit" value="确认删除"></p>
</form>
</body>
</html>

编写完成后,在 index\views.py 中编写视图层逻辑代码,如下所示:

def delete_book(request,book_id):book_id=int(book_id)try:book=Book.objects.get(id=book_id)except Exception as e:print('get查询出现了异常没找到数据',e)return HttpResponse('这里没有任何书籍可以被删除')if request.method=="GET":return render(request,'index/delete_book.html',locals())elif request.method=="POST":book.delete()return HttpResponseRedirect("/index/all_book")return HttpResponse("书籍条目信息删除功能")

并配置路由映射关系,如下所示:

urlpatterns=[path('delete_book/<int:book_id>',views.delete_book)
]

访问 127.0.01:8000/index/all_book/ 可以直接点击 option 中对应书籍的删除功能,会得到如下页面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kSHnW6QK-1683382110065)(imgs\企业微信截图_20230505160031.png)]

点击确认删除,则 url 会重新定向到书籍展示页,大家会看到 《钢铁》 书籍条目已经被删除了,如下所示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pjs254nU-1683382110066)(imgs\企业微信截图_20230505160141.png)]

至此我们完成了 Django 小型图书管理项目的所有逻辑代码,实现了图书的增删改查操作,我们主要运用了一些前面讲过的知识,比如 ORM 模块等。

3 Django静态文件配置

js、css、img等都叫做静态文件。

那么关于django中静态文件的配置,我们就需要在settings配置文件里面做一些修改。

STATIC_URL = '/static/'STATICFILES_DIRS = [os.path.join(BASE_DIR, 'commomStatic')  # 第二个参数就是项目中存放静态文件的文件夹名称
]

STATIC_URL是在某个具体的App下新建static目录,用来存放与App相关的静态资源。

STATICFILES_DIRS是在项目目录下新建commomStatic目录,用来存放多个App之间公共的静态资源。

STATIC_ROOT是项目部署的时候才会用到的,是配合Nginx使用的。

3.1 创建静态文件目录

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-so2jG8ln-1683382110066)(imgs\企业微信截图_20230505182010.png)]

前端页面引入静态文件的写法如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41CfnlZr-1683382110067)(imgs\企业微信截图_20230505182250.png)]

更多示例如下:

图片:

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

js文件:

{% load static %}
<script src="{% static "mytest.js" %}"></script>

更多示例如下:

图片:

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

js文件:

{% load static %}
<script src="{% static "mytest.js" %}"></script>

http://www.ppmy.cn/news/63771.html

相关文章

数据结构与算法十 并查集

一 并查集 并查集是一种树型的数据结构 &#xff0c;并查集可以高效地进行如下操作&#xff1a; 查询元素p和元素q是否属于同一组合并元素p和元素q所在的组 1.1 并查集结构 并查集也是一种树型结构&#xff0c;但这棵树跟我们之前讲的二叉树、红黑树、B树等都不一样&#xf…

C++好难(6):模板初阶

【本节目标】 1. 泛型编程2. 函数模板3. 类模板 目录 【本节目标】 1.泛型编程 2.函数模板 概念&#xff1a; 格式&#xff1a; 原理&#xff1a; 实例化&#xff1a; 1.隐式实例化&#xff1a; 2.显式实例化 原则一&#xff1a; 原则二&#xff1a; 原则三&#…

CentOS 7(2009) 升级 GCC 版本

1. 前言 CentOS 7 默认安装的 gcc 版本为 4.8&#xff0c;但是很多时候都会需要用到更高版本的 gcc 来编译源码&#xff0c;那么本文将会介绍如何在线升级 CentOS 的 gcc 版本。 2. 升级 GCC (1). 安装 centos-release-scl&#xff1b; [imaginemiraclecentos7 ~]$ sudo yum…

C语言:指针求解鸡兔同笼问题

题目&#xff1a;鸡兔同笼问题 要求&#xff1a;使用自定义函数void calc(int h, int f,int *c,int *r) 求解鸡兔同笼问题。 h 表示总的头数&#xff0c;f 表示总的脚数。 例子&#xff1a; 输入&#xff1a; 5 16 输出&#xff1a; 2 3 分析&#xff1a; 在该代码中&a…

即时通讯APP开发费用成本多少?

移动互联网的发展&#xff0c;为人们的通讯交流提供了非常多的便利&#xff0c;一些即时通讯APP的出现&#xff0c;将人与人的距离再一次缩短。通过即时通讯APP软件&#xff0c;人们可以随时随地了解身边发生的新鲜事物&#xff0c;以及和朋友探讨各类趣事&#xff0c;甚至可以…

HTTP第三讲——四层模型、七层模型

四层模型 TCP/IP 协议&#xff0c;它是 HTTP 协议的下层协议&#xff0c;负责具体的数据传输 工作。TCP/IP 协议是一个“有层次的协议栈”。 TCP/IP 当初的设计者真的是非常聪明&#xff0c;创造性地提出了“分层”的概念&#xff0c;把复杂的网络通信划分出多个层次&#xff…

数据结构——结构体 内存对齐

在C语言中&#xff0c;可以使用结构体&#xff08;Struct&#xff09;来存放一组不同类型的数据。结构体是一种集合&#xff0c;它里面包含了多个变量或数组&#xff0c;它们的类型可以相同&#xff0c;也可以不同&#xff0c;每个这样的变量或数组都称为结构体的成员&#xff…

ESP32学习笔记20-dac

20.DAC 20.1概述 ESP32 有两个 8 位数模转换器 (DAC) 通道,分别连接到 GPIO25(通道 1)和 GPIO26(通道 2)每个 DAC 通道可以将数字值 0-255 转换成模拟电压 0-Vrefout_voltage = Vref * digi_val / 255DAC 外设支持以下列方式输出模拟信号: 直接输出电压。DAC 通道持续输…