新建一个Django项目示例--出版社管理系统
时间:2020-04-22
本文章向大家介绍新建一个Django项目示例--出版社管理系统,主要包括新建一个Django项目示例--出版社管理系统使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一、创建Django项目
1. 命令行创建方式 1. cd到你要保存Django项目的目录 2. Django-admin startproject 项目名 --> 会在当前目录创建Django项目 2. PyCharm创建方式 1. File --> new project --> ... 2. 创建完之后一定要选在新窗口打开!!!
PyCharm创建Django项目:
二、配置Django项目
1. settings.py文件 1. templates文件夹的位置 2. 静态文件 1. STATIC_URL --> 静态文件夹的别名(在HTML文件中用的) 2. STATICFILES_DIRS --> 静态文件夹的真正路径 3. 注释掉setting.py中 带有 csrf 的那一行(大概45~47行) 4. Django项目连接的数据库信息
1、静态文件配置
2、注释掉setting.py中 带有 csrf 的那一行(大概45~47行)
3、 Django项目连接的数据库信息
见下面四、ODR中的 2. 在settings.py里面,配置数据库的连接信息
三、Django WEB请求流程(简版)
1. 启动Django项目,等待用户连接 2. 浏览器在地址栏输入URL,来连接我的Django项目 3. 在urls.py中找路径和函数的对应关系 4. 执行对应的函数 5. 返回响应
views.py文件:
1. 专门用来定义处理请求的函数 1. 基本必备三件套 from django.shortcuts import HttpResponse, render, redirect 1. HttpResponse("要返回的内容") --> 通常用于直接返回数据 2. render(request, "html文件", {"k1": v1}) --> 返回一个HTML文件或者打开文件进行字符串替换 3. redirect("URL") --> 告诉用户的浏览器去访问其他的URL 2. request相关 1. request.method --> 查看请求的方法 2. request.POST --> 获取POST请求的数据
四、ORM使用
1. 什么是ORM? 是一种编程的方法论(模型), 和语言无关.(其他的语言也有类似的实现.) 2. ORM的本质: 类 ---> 数据表 对象 ---> 数据行 属性 ---> 字段 按照规定的语法写,自动翻译成对应的SQL语句. 3. ORM的功能: ORM操作数据表 ORM操作数据行 4. Django里ORM的使用: 1. 手动创建数据库 2. 在settings.py里面,配置数据库的连接信息 DATABASES = { 'default': { 'ENGINE': jango.db.backends.mysql', 'NAME': 'day62', 'HOST': '127.0.0.1', 'PORT': 3306, 'USER': 'root', 'PASSWORD': '123456', } } 3. 在项目/__init__.py告诉Django用pymysql模块代替MySQLdb来连接MySQL数据库 import pymysql pymysql.install_as_MySQLdb() 4. 在app/models.py里面定义类 # 出版社 class Publisher(models.Model): id = models.AutoField(primary_key=True) # 自增的ID主键 # 创建一个varchar(64)的唯一的不为空的字段 name = models.CharField(max_length=64, null=False, unique=True) 5. 执行两个命令 1. python3 manage.py makemigrations --> 把models.py里面的更改记录到小本本上 2. python3 manage.py migrate --> 把更改翻译成SQL语句,去数据库执行
1、在cmd中新建一个数据库
2. 在settings.py里面,配置数据库的连接信息
3. 在项目/__init__.py告诉Django用pymysql模块代替MySQLdb来连接MySQL数据库
4、在app/models.py里面定义类(这里以创建一个图书管理系统为例)
5、 执行两个命令
在pycharm下面的Terminal 中依次执行以下两条命令
1. python3 manage.py makemigrations #把models.py里面的更改记录到小本本上 2. python3 manage.py migrate #把更改翻译成SQL语句,去数据库执行
五、pycharm连接数据库操作
1、展示出版社列表
(1) 在urls.py中添加一个函数对应关系
(2) 在views中添加对应的函数
from django.shortcuts import render from app01 import models # Create your views here. # 展示出版社列表 def publisher_list(request): # 去数据库查出所有的出版社,填充到HTML中,给用户返回 ret = models.Publisher.objects.all().order_by("id") return render(request, "publisher_list.html", {"publisher_list": ret})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>出版社列表</title> </head> <body> <a href="/add_publisher/">添加新的出版社</a> <table border="1"> <thead> <tr> <th>序号</th> <th>ID</th> <th>出版社名称</th> <th>操作</th> </tr> </thead> <tbody> {% for publisher in publisher_list %} <tr> {# 循环添加序号#} <td>{{ forloop.counter }}</td> {# 循环取出库中的ID#} <td>{{ publisher.id }}</td> {# 循环取出库中的name#} <td>{{ publisher.name }}</td> <td> <a href="/delete_publisher/?id={{ publisher.id }}">删除</a> <a href="/edit_publisher/?id={{ publisher.id }}">编辑</a> </td> </tr> {% endfor %} </tbody> </table> </body> </html>
此时点击运行,在浏览器中输入http://127.0.0.1:8000/publisher_list/就会出现:
2、添加新的出版社
<a href="/add_publisher/">添加新的出版社</a>
(1) 在urls.py中新添加一个函数对应关系
url(r'^add_publisher/', views.add_publisher),
(2) 在views中添加对应的函数
# 添加新的出版社 def add_publisher(request): error_msg = "" # 如果是POST请求,我就取到用户填写的数据 if request.method == "POST": new_name = request.POST.get("publisher_name", None) if new_name: # 通过ORM去数据库里新建一条记录 models.Publisher.objects.create(name=new_name) # 引导用户访问出版社列表页,查看是否添加成功 --> 跳转 return redirect("/publisher_list/") else: error_msg = "出版社名字不能为空!" # 用户第一次来,我给他返回一个用来填写的HTML页面 return render(request, "add_publisher.html", {"error": error_msg})
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>添加出版社</title> </head> <body> <h1>添加出版社</h1> <form action="/add_publisher/" method="post"> <input type="text" name="publisher_name"> <input type="submit" value="提交"> <p style="color: red">{{ error }}</p> </form> </body> </html> {#form表单提交数据需要注意的几点:#} {#1、所有的获取用户输入的都要写到写到form表单里面#} {#2、method=""#} {#3、action表示往哪里提交#}
3、删除出版社
<a href="/delete_publisher/?id={{ publisher.id }}">删除</a>
(1) 在urls.py中添加一个函数对应关系
url(r'^delete_publisher/', views.delete_publisher),
(2) 在views中添加对应的函数
# 删除出版社的函数 def delete_publisher(request): print(request.GET) print("=" * 120) # 删除指定的数据 # 1. 从GET请求的参数里面拿到将要删除的数据的ID值,这个ID值是点击的时候附加的一个参数,见上面a标签 del_id = request.GET.get("id", None) # 字典取值,取不到默认为None # 如果能取到id值 if del_id: # 去数据库删除当前id值的数据 # 根据id值查找到数据 del_obj = models.Publisher.objects.get(id=del_id) # 删除 del_obj.delete() # 返回删除后的页面,跳转到出版社的列表页,查看删除是否成功 return redirect("/publisher_list/") else: return HttpResponse("要删除的数据不存在!")
4、编辑出版社
<a href="/edit_publisher/?id={{ publisher.id }}">编辑</a>
(1) 在urls.py中添加一个函数对应关系
url(r'^edit_publisher/', views.edit_publisher),
(2) 在views中添加对应的函数
# 编辑出版社 def edit_publisher(request): # 用户修改完出版社的名字,点击提交按钮,给我发来新的出版社名字 if request.method == "POST": print(request.POST) # 取新出版社名字 edit_id = request.POST.get("id") new_name = request.POST.get("publisher_name") # 更新出版社 # 根据id取到编辑的是哪个出版社 edit_publisher = models.Publisher.objects.get(id=edit_id) edit_publisher.name = new_name edit_publisher.save() # 把修改提交到数据库 # 跳转出版社列表页,查看是否修改成功 return redirect("/publisher_list/") # 从GET请求的URL中取到id参数 edit_id = request.GET.get("id") if edit_id: # 获取到当前编辑的出版社对象 publisher_obj = models.Publisher.objects.get(id=edit_id) return render(request, "edit_publisher.html", {"publisher": publisher_obj}) else: return HttpResponse("编辑的出版社不存在!")
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>编辑出版社</title> </head> <body> <h1>编辑出版社</h1> <form action="/edit_publisher/" method="post"> <input type="text" name="id" value="{{ publisher.id }}" style="display: none"> <input type="text" name="publisher_name" value="{{ publisher.name }}"> <input type="submit" value="提交"> <p style="color: red">{{ error }}</p> </form> </body> </html>
原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/12745049.html
- 科协带你开个2017年科技世界的总结会!
- 基于StockRanker算法的机器学习量化策略
- Enterprise Library深入解析与灵活应用(6):自己动手创建迷你版AOP框架
- 交易费用过高的比特币还能成为“未来货币”吗?
- 应用大数据,做好技术成果市场价值评估
- Linux和Windows的换行符
- 行业数据重要性不用多说,呕心整理分享(2)
- 云计算如何在银行业务发挥作用?
- SNH48 要推出定制 AI 形象,和初音未来有什么不同?
- 字节对齐
- 微信更新为小程序引入游戏功能,朋友圈又刷屏了
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于WS-MEX的实现](提供模拟程序)
- Linux同步机制(二) - 条件变量,信号量,文件锁,栅栏
- WCF技术剖析之二十七: 如何将一个服务发布成WSDL[基于HTTP-GET的实现](提供模拟程序)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go语言入门(二)-流程控制
- 【Java8新特性】02 函数式接口和Lambda表达式实战练习:环绕执行模式使行为参数化
- Go语言入门(三)数组和切片
- 一天一大 leet(回文数)难度:简单 DAY-10
- 如何使用docker搭建PHP环境
- Go语言入门(四)Map&函数
- 一天一大 leet(每日温度)难度:中等 DAY-11
- Go语言入门(五)结构体&练习
- 利用hexo和github或coding 搭免费个人博客
- window 指令之 tree
- Go语言入门(六)结构体后续&指针
- 一天一大 leet(二叉树的序列化与反序列化)难度:困难 DAY-16
- 一天一大 leet(三数之和)难度:中等 DAY-12
- MongoDB Docker版本:基础入门和复制集
- Django连接MySql使用models处理数据