Web框架开发-开发图书管理页面

一、项目需求
1.列出图书列表、出版社列表、作者列表2.点击作者,会列出其出版的图书列表3.点击出版社,会列出旗下图书列表4.可以创建、修改、删除 图书、作者、出版社二、项目实现
bookms
|-- app01  # 项目应用
|   |-- views.py  # 视图层代码
|   |-- admin.py
|   |-- apps.py
|   |-- models.py # 模型层,定义数据库模型
|   |-- tests.py
|
|-- bookms  # 项目工程
|   |-- settings.py     # 项目的配置文件
|   |-- urls.py     # 路由层
|   |-- wsgi.py
|
|-- templates   # 项目模板
|   |-- addauthor.html  # 添加作者的模板
|   |-- addbook.html    # 添加图书的模板
|   |-- addpublish.html     # 添加出版社的模板
|   |-- author.html     # 作者的列表
|   |-- base.html       # 基础框架模板  
|   |-- books.html      # 图书的列表    
|   |-- changebook.html     # 编辑图书的模板    
|   |-- editauthor.html     # 编辑作者的模板    
|   |-- editpublish.html    # 编辑出版社的模板  
|   |-- index.html      # 登录首页  
|   |-- publish.html    # 出版社的列表  
|   |-- reg.html        # 注册页面  
|   |-- reg_succes.html     # 注册成功的页面
|
|-- manage.py   # 项目启动相关的### 三、数据库设计class Book(models.Model):   # 必须要继承的id = models.AutoField(primary_key=True)title = models.CharField(max_length=32)publishData = models.DateField()    # 出版日期authorlist = models.ManyToManyField(to="Author")price = models.DecimalField(max_digits=5, decimal_places=2)     # 一共5位,保留两位小数# 不用命名为publish_id,因为django为我们自动就加上了_idpublish = models.ForeignKey(to="Publish", to_field="id", on_delete=models.CASCADE)def __str__(self):return self.titleclass Publish(models.Model):# 不写id的时候数据库会自动增加name = models.CharField(max_length=32)addr = models.CharField(max_length=32)email = models.EmailField()def __str__(self):return self.nameclass Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()# 与AuthorDetail建立一对一的关系def __str__(self):return self.name###  四、操作步骤1、先注册用户2、用注册的用户进行登录3、创建作者4、创建出版社5、新建图书信息6、点击作者姓名,跳转到该作者出版的图书列表7、点击出版社名称,跳转到该出版社出版的图书列表五、实现效果
1、登录页面

  2、注册页面

  3、图书列表页面

  4、作者页面

  5、出版社页面

六、项目代码

views.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

from django.contrib import auth

from django.contrib.auth.decorators import login_required

from django.contrib.auth.models import User

from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage

from django.http import HttpResponse, HttpResponseRedirect

from django.shortcuts import render, redirect

# Create your views here.

from app01 import models

def index(request):

    return render(request, "index.html")

# 注册

def reg(request):

    if request.method == "POST":

        username = request.POST.get("username")

        password = request.POST.get("password")

        password1 = request.POST.get("password1")

        print(username, password, password1)

        if username != str(User.objects.filter(username=username).first()) and len(username) != 0:

            s = "注册成功"

            if password == password1 and len(password) != 0:  # 当密码与确认密码一致的时候,注册成功

                User.objects.create_user(username=username, password=password)

                return render(request, "reg_succes.html", {"username": username, "s": s})

            elif len(password) == 0:

                return render(request, "reg.html", {"s3": "密码不能为空!"})

            else:

                s1 = "两次输入的密码不一致"

                return render(request, "reg.html", {"s1": s1})

        elif len(username) == 0:

            return render(request, "reg.html", {"s2": "用户名不能为空!"})

        else:

            mess = "用户名已经存在!"

            return render(request, "reg.html", {"mess": mess})

    return render(request, "reg.html")

def reg_succes(request):

    return render(request, "reg_succes.html")

# 登录

def login(request):

    if request.method == "POST":

        username = request.POST.get("username")

        password = request.POST.get("password")

        print(username, password)

        user = auth.authenticate(username=username, password=password)  # 验证用户名和密码

        if user is not None and user.is_active:

            #  如果认证成功,就让登录

            auth.login(request, user)

            request.session['user'] = username  # 将session信息记录到浏览器

            response = HttpResponseRedirect("/books/")

            return response

        elif user is None:

            return render(request, "index.html", {"s1": "用户名不存在!"})

        else:

            s = "用户名或密码错误"

            return render(request, "index.html", {"s": s})

    return render(request, "index.html")

@login_required

# 新增书籍

def addbook(request):

    publish_list = models.Publish.objects.all()  # 查询出所有的出版社对象

    author_list = models.Author.objects.all()

    if request.method == "POST":

        title = request.POST.get("title")

        date = request.POST.get("date")

        price = request.POST.get("price")

        publish_id = request.POST.get("publish_id")

        authors_id_list = request.POST.getlist("authors_id_list")

        if title != str(models.Book.objects.filter(title=title).first()) and len(title) !=0:

            book_obj = models.Book.objects.create(title=title, publish_id=publish_id, publishData=date, price=price)

            book_obj.authorlist.add(*authors_id_list)

            return redirect("/books")

        elif len(title) == 0:

            return render(request, "addbook.html", {"s": "书籍名称不能为空!", "publish_list": publish_list,

                                                    "author_list": author_list})

        else:

            return render(request, "addbook.html", {"s1": "书籍名称已经存在!", "publish_list": publish_list,

                                                    "author_list": author_list})

    return render(request, "addbook.html", {"publish_list": publish_list, "author_list": author_list})

# 查看图书列表

@login_required

def books(request, field_id=0, field_type='src'):

    '''

    图书列表有3种情况:

    点击查看图书列表(books)显示的的图书

    点击出版社(publishs)显示的图书

    点击作者(authors)显示的图书

    :param request:

    :param field_id

    :param field_type: /publishs /anthors

    :return:

    '''

    if field_type == 'publishs':

        book_list = models.Book.objects.filter(publish_id=field_id).all()

    elif field_type == 'authors':

        book_list = models.Book.objects.filter(authorlist__id=field_id).all()

    else:

        book_list = models.Book.objects.all()

    username = request.session.get('user')

    paginator = Paginator(book_list, 10)

    page = request.GET.get('page', 1)

    currentPage = int(page)

    try:

        book_list = paginator.page(page)

    except PageNotAnInteger:

        book_list = paginator.page(1)

    except EmptyPage:

        book_list = paginator.page(paginator.num_pages)

    return render(request, "books.html", {"user": username, "book_list": book_list, "paginator": paginator,

                                          "currentPage": currentPage})

# 编辑图书

@login_required

def changebook(request, id):

    edit_book_obj = models.Book.objects.filter(id=id).first()

    if request.method == "POST":

        title = request.POST.get("title")

        date = request.POST.get("date")

        price = request.POST.get("price")

        authors_id_list = request.POST.getlist("authors_id_list")

        publish_id = request.POST.get("publish_id")

        if len(title) != 0:

            models.Book.objects.filter(id=id).update(title=title, publishData=date, price=price, publish_id=publish_id)

            edit_book_obj.authorlist.set(authors_id_list)

            return redirect("/books")

        else:

            return render(request, "changebook.html", {"s": "书籍名称不能为空!"})

    publish_list = models.Publish.objects.all()

    author_list = models.Author.objects.all()

    return render(request, "changebook.html", {"edit_book_obj": edit_book_obj, "publish_list": publish_list,

                                               "author_list": author_list})

# 删除图书

@login_required

def delbook(request, id):

    models.Book.objects.filter(id=id).delete()

    return redirect("/books")

# 注销登录

@login_required

def logout(request):

    auth.logout(request)

    return redirect("/index")

@login_required

# 添加作者

def addauthor(request):

    if request.method == "POST":

        name = request.POST.get("name")

        age = request.POST.get("age")

        if name != (models.Author.objects.filter(name=name).first()) and len(name) != 0:

            models.Author.objects.create(name=name, age=age)

            return redirect("/authors/")

        elif len(name) == 0:

            return render(request, "addauthor.html", {"s": "作者姓名不能为空!"})

    return render(request, "addauthor.html")

# 编辑作者

def editauthor(request, id):

    author_obj = models.Author.objects.filter(id=id).first()

    if request.method == "POST":

        name = request.POST.get("name")

        age = request.POST.get("age")

        if name != (models.Author.objects.filter(name=name).first()) and len(name) != 0:

            models.Author.objects.filter(id=id).update(name=name, age=age)

            return redirect("/authors/")

        elif len(name) == 0:

            return render(request, "addauthor.html", {"s": "作者姓名不能为空!"})

    return render(request, "editauthor.html", {"author_obj": author_obj})

# 删除作者

def delauthor(request, id):

    models.Author.objects.filter(id=id).delete()

    return redirect("/authors/")

@login_required

def authors(request):

    author_list = models.Author.objects.all()

    return render(request, "author.html", locals())

@login_required

# 添加出版社

def addpublish(request):

    if request.method == "POST":

        name = request.POST.get("name")

        addr = request.POST.get("addr")

        email = request.POST.get("email")

        if name != (models.Publish.objects.filter(name=name).first()) and len(name) != 0:

            models.Publish.objects.create(name=name, addr=addr, email=email)

            return redirect("/publishs/")

        elif len(name) == 0:

            return render(request, "addpublish.html", {"s": "出版社名称不能为空!"})

        else:

            return render(request, "addpublish.html", {"s1": "出版社名称已经存在!"})

    return render(request, "addpublish.html")

# 查看出版社

@login_required

def publishs(request):

    pub_list = models.Publish.objects.all()

    return render(request, "publish.html", locals())

# 编辑出版社

def editpublish(request, id):

    pub_obj = models.Publish.objects.filter(id=id).first()

    if request.method == "POST":

        name = request.POST.get("name")

        addr = request.POST.get("addr")

        email = request.POST.get("email")

        if name != (models.Publish.objects.filter(name=name).first()) and len(name) != 0:

            models.Publish.objects.create(name=name, addr=addr, email=email)

            return redirect("/publishs/")

        elif len(name) == 0:

            return render(request, "editpublish.html", {"s": "出版社名称不能为空!"})

        else:

            return render(request, "editpublish.html", {"s1": "出版社名称已经存在!"})

    return render(request, "editpublish.html", {"pub_obj": pub_obj})

# 删除出版社

def delpublish(request, id):

    models.Publish.objects.filter(id=id).delete()

    return redirect("/publishs/")

  

models.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

from django.db import models

# Create your models here.

class Book(models.Model):   # 必须要继承的

    id = models.AutoField(primary_key=True)

    title = models.CharFie

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

launchctl及其配置、使用、示例

文章目录 launchctl 是什么Unix / Linux类似的工具有什么哪个更常用配置使用常用子命令示例加载一个 launch agent:卸载一个 launch daemon:列出所有已加载的服务:启动一个服务:停止一个服务:禁用一个服务:启用一个服务: 附com.example.myagent.plist内容有趣的例子参考 launch…

HuggingChat

HuggingChat 文章目录 HuggingChat一、关于 HuggingChat二、ChatLogin进入对话首页对话 三、Assistants1、使用2、创建新的助理 一、关于 HuggingChat HuggingFace 发布的 Chat 工具 网站:https://huggingface.co/chat/chat-ui space : https://huggingface.co/sp…

探讨苹果 Vision Pro 的空间视频(术语辨析、关键技术、思考)

背景:一位资深视频技术从业者在 Pixvana 工作,积累了丰富的捕获、处理、编码、流传和播放空间媒体经验。 一、术语 空间视频:传统的 3D 视频,呈矩形,包含左右眼视图,如 iPhone15 Pro 和 Vision Pro 可录制。沉浸式视频:非矩形的环绕式视频体验,通常由两个或多个传感器…

深化涉案企业合规改革:从治标到治本的必由之路

在市场经济的大潮中,企业作为经济发展的主体,其健康运行对整个社会的稳定与繁荣至关重要。然而,随着经济全球化的加速和市场竞争的激烈,一些企业在追求利润最大化的过程中,可能会忽视法律法规,甚至触犯法律…

H6603实地架构降压芯片100V耐压 80V 72V 60V 48V单片机/模块供电应用

H6603 是一款内置功率 MOSFET降压开关转换器。在宽输入范围内,其最大持续输出电流 0.8A,具有极好的负载和线性调整率。电流控制模式提供了快速瞬态响应,并使环路更易稳定。故障保护包括逐周期限流保护和过温保护。H6603 最大限度地减少了现有…

五、保持长期高效的七个法则(二)Rules for Staying Productive Long-Term(1)

For instance - lets say youre a writer.You have a bunch of tasks on your plate for the day, but all of a sudden you get a really good idea for an essay. You should probably start writing now or youll lose your train of thought.What should you do? 举例来说…

C#,精巧实用的代码,调用GDI32.DLL绘制图形的源程序

C#画图既可以使用 System.Drawing 命名空间的各种基础类。在某些情况下,也可以直接调用 Windows 的公共基础链接库 GDI32.DLL。 1 GDI32.DLL图形设备接口 意图 Microsoft Windows图形设备界面(GDI)使应用程序能够在视频显示器和打印机上使用图形和格式化文本。基于Window…

Sora底层技术原理:Stable Diffusion运行原理

AIGC 热潮正猛烈地席卷开来,可以说 Stable Diffusion 开源发布把 AI 图像生成提高了全新高度,特别是 ControlNet 和 T2I-Adapter 控制模块的提出进一步提高生成可控性,也在逐渐改变一部分行业的生产模式。惊艳其出色表现,也不禁好…

使用Python进行自然语言处理(NLP):NLTK与Spacy的比较【第133篇—NLTK与Spacy】

👽发现宝藏 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python进行自然语言处理(NLP):NLTK与Spacy的比较 自…

【ubuntu20.04+tensorflow-gpu1.14配置】

ubuntu20.04tensorflow-gpu1.14配置 目录0. 版本注意事项说明1. 个人目录下载后配置系统环境变量2. anaconda配置所有环境(推荐)3. 验证tensorflow-gpu4. 一些细节 目录 总结出两种方法 个人目录 下载cuda和cudnnanaconda虚拟环境 下载cudatoolkit和cu…

Unity游戏项目接广告

Unity游戏项目中接入GoogleAdMob 先看效果图 接入测试横幅广告,代码如下: using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleMobileAds.Api; using System;public class GoogleAdMobManager : MonoBehavi…

【鸿蒙HarmonyOS开发笔记】应用数据持久化之通过用户首选项实现数据持久化

概述 应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。 HarmonyOS标准系统支持典型的存储数据形态,包…

如何配置VS Code环境

一、下载 Visual Studio Code - Code Editing. Redefined 二、傻瓜式安装 如果出现没有安装路径选择,则看下面图片 经过上面操作后,可以修改路径 三、按照下面步骤配置环境变量即可 Visual Studio Code 中的 C 和 MinGW-w64 入门

信雅纳400/800G网络测试仪之 CDF/ Extended Payload 功能:完全用户自定义的协议报文支持/可编程的协议内容支持

Note# 2024-3-21 今天被一个做芯片测试的客户追着问,应该合作在测试仪上做完全自定义的报文,添加自己的私有协议进去,他觉得每次都导入报头太麻烦了,然后就看了下Application Note关于CDF功能的描述,照着机翻的版本来…

D55125ADA A型漏电保护芯片,适用于 110V⁓220V(50/60Hz)电压,可应用于 新能源充电桩(充电枪)、智能空开(智能微断开关)等工业产品

一、应用领域 新能源充电桩(充电枪)、智能空开(智能微断开关)等工业产品,以及电热水器、电烤箱、电烤炉等小家电产品。 二、功能介绍 D55125ADA 是一款高性能 CMOS 漏电保护器专用电路。芯片内部包含稳压电源、放大电路…

IP 协议的相关特性

1.IP协议的特性 无连接性。IP协议是一种无连接协议,这意味着数据包在传输过程中不需要保留连接状态信息。每个数据包都是独立发送和处理的,每个包都可以按不同的路径传输到目的地。 不可靠性。IP协议不提供任何可靠性保证,数据包在传输过程…

设计模式 模板方法模式

01.如果接到一个任务,要求设计不同型号的悍马车 02.设计一个悍马车的抽象类(模具,车模) public abstract class HummerModel {/** 首先,这个模型要能够被发动起来,别管是手摇发动,还是电力发动…

鸿蒙Harmony应用开发—ArkTS-全局UI方法(列表选择弹窗)

列表弹窗。 说明: 从API Version 8开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。 本模块功能依赖UI的执行上下文,不可在UI上下文不明确的地方使用,参见UIContext说明。 从API version 10开始&#xff0…

什么是VR应急预案演练虚拟化|VR体验馆加盟|元宇宙文旅

VR 应急预案演练虚拟化指的是利用虚拟现实(Virtual Reality,VR)技术进行应急预案演练的过程。在传统的应急预案演练中,人们通常需要在实际场地或模拟环境中进行演练,这可能存在一些限制,如成本高昂、场地受…

C语言每日一题06

一、题目 二、解析 void main () { char c1,c2; int a1,a2; c1 getchar ();//读取第一个输入,c11 scanf (“%3d”,&a1&#xff…