Django2.0单表图书馆系统开发流程
Django单表开发流程
一、创建Django项目:
(1)cmd下
1.查看Django版本:python -m django --version
2.创建Django项目:django-admin startproject mysite(cd到你要创建的文件下)
3.切换到Django项目目录下,启动Django:python manage.py runserver
(2)pycharm下
1.New Project:创建新的Django项目(建议在more setting 中,可设置应用application name)
二、设置settings.py文件:
(1)修改TEMPLATES中的'DIRS':
1 os.path.join(BASE_DIR, 'templates')
(2)如果想打印orm转换过程中的sql,需要在settings中进行如下配置:
1 LOGGING = {
2 'version': 1,
3 'disable_existing_loggers': False,
4 'handlers': {
5 'console':{
6 'level':'DEBUG',
7 'class':'logging.StreamHandler',
8 },
9 },
10 'loggers': {
11 'django.db.backends': {
12 'handlers': ['console'],
13 'propagate': True,
14 'level':'DEBUG',
15 },
16 }
17 }
(3)把settings自带的DATABASES替换成自己的:
DATABASES = {
'default':{
'ENGINE': 'django.db.backends.mysql', # 改成所用的数据库
'NAME':'library', # 要连接的数据库,连接前在账号下需要创建好数据库
'USER':'root2', # 连接数据库的用户名
'PASSWORD':'123', # 连接数据库的密码
'HOST':'127.0.0.1', # 连接主机默认本机
'POST':3306 # 端口 默认3306
}
}
(4)如果INSTALLED_APPS里没有应用的名称,需要手动添加“application name”
(5)管理不同应用的css/js等静态文件:在一个应用里创建static文件夹,用于管理文件
结构:
settings.py:添加代码
STATICFILES_DIRS=[
os.path.join(BASE_DIR, "static"),
]
三、为应用配置models.py
(1)models.py用于创建表结构:之后表的增删改查全部由该类的对象进行操作
1 from django.db import models #必须导入
2
3 # Create your models here.
4
5 class Book(models.Model): # 类一定要继承models.Model
6 id = models.AutoField(primary_key=True)#AutoField:自增;primary_key:主键
7 title = models.CharField(max_length=32)#CharField:字符串
8 pub_date = models.DateField()
9 price = models.DecimalField(max_digits=8, decimal_places=2)#类似于double,精读高的浮点数,max_digits最大位数(包括decimal小数部分),decimal小数部分
10 publish = models.CharField(max_length=32)
11
12 #打印对象,默认打印一长串object属性
13 #__str__当对象生成的时候自动触发
14 def __str__(self):
15 return self.title # 打印对象的QuerySet类型
(2)一定要在项目全局文件中的__init__中设置:
1 import pymysql
2
3 pymysql.install_as_MySQLdb()
(3)创建完之后一定要运行:进行python语句和sql语句的转换
1 两条数据库迁移命令即可在指定的数据库中创建表 :
2 python manage.py makemigrations
3 python manage.py migrate
四、urls里配置路由
(1)导入创建应用的views
1 from django.urls import path, re_path
2 from app01 import views
(2)配置路由
urlpatterns = [
path('admin/', admin.site.urls),
path('book/', views.book),
path('addbook/', views.addbook),
re_path('^$', views.book),
re_path(r"book/(\d+)/delete", views.delbook) , # (\d+)捕获数字 delbook(request,数字)
re_path(r"book/(\d+)/change", views.changebook) # (\d+)捕获数字 delbook(request,数字)
]
(3)如果有多个应用,则应该使用分发:让每一个应用有单独自己的url路径
第一步:为每一个应用创建一个urls.py进行分流
第二步:在全局urls中进行分发:
1 #分发:
2 #让每一个应用有单独自己的url路径
3 re_path(r"app01/",include(("app01.urls","app01"))), # include(('',''))创建两个房间,第二个参数:namespace用来区别同样的urls
4 re_path(r"app02/",include(("app02.urls","app02"))),
5
6 #去掉app01/的分发:
7 re_path(r"^",include("app01.urls")),
8
9 path("articles/<mm:month>/", views.month)
五、创建对应的视图函数
(1)导入必要的模块
from django.shortcuts import render, HttpResponse, redirect
(2)视图函数都需要有返回值return,通常返回值有三种
1 return render(request, 'changebook.html',{"book_obj":book_obj}) # 给html传入值需要遵循格式:{"book_obj":变量}
2 return HttpResponse("Hello World")
3 return redirect("/book") # 进行重定向,不再需要在form表单action里进行定义
(3)获取input标签里的值(input标签里一定要定义name="",才能从请求中根据name找到对应的value):
1 if request.method == 'POST': # 判断请求方式
2 title = request.POST.get("title")
3 price = request.POST.get("price")
4 pub_date = request.POST.get("pub_date")
5 publish = request.POST.get("publish")
6
7#添加表数据,需要导入表对象Book
8 book_obj = Book.objects.create(title=title, price=price, pub_date=pub_date, publish=publish)
(4)表对象的各种obj.object.操作:
首先导入需要用到的表:
from app01.models import Book
从表中拿到input收集到的各种value
book_list = Book.objects.all() # [obj1,obj2....]
通过render传入变量
return render(request,'book.html',locals()) #local()传入该函数局部变量
(5)模板语法
html页面for循环添加table-tbody元素(元素由render传入的变量提供)
1 <tbody>
2 {% for book in book_list %}
3 <tr>
4 <td>{{ book.title }}</td> #通过模板语法{{}}调用表对象的属性
5 <td>{{ book.price }}</td>
6 <td>{{ book.pub_date|date:"Y-m-d" }}</td> # 通过过滤器|date:"参数"改变日期格式
7 <td>{{ book.publish }}</td>
8 <td>
9 <a href="/book/{{ book.pk }}/delete" class="btn btn-danger">删除</a> # pk为表的自增主键,自动查找
10 </td>
11 <td>
12 <a href="/book/{{ book.pk }}/change" class="btn btn-info">编辑</a>
13 </td>
14 </tr>
15 {% endfor %}
16 </tbody>
点击删除按钮删除数据:通过a标签跳转到带有对应ID的数据库数据url(全局url路由器里)通常在网页上对数据进行操作都需要定义一个url(r"xx/(\d+)/xxx")格式专门用于操作
re_path(r"book/(\d+)/delete", views.delbook) , # (\d+)捕获数字 delbook(request,数字)
通过模板语法进行删除;再返回该页面(redirect)
1 def delbook(request, id):
2
3 Book.objects.filter(id=id).delete() # 删除book.pk对应的ID的数据
4
5 #删除后进行重定向需要导入redirect
6 return redirect("/book")
修改数据:与删除一样拿到数据唯一的ID,进行修改
1 def changebook(request, id):
2 #a标签进入的页面默认为get
3 #不管是什么请求进入的changebook都获取book_obj
4 book_obj = Book.objects.filter(id=id).first() #first() 拿到queryset的第一个对象
5
6 if request.method == "POST":
7 title = request.POST.get("title")
8 price = request.POST.get("price")
9 pub_date = request.POST.get("pub_date")
10 publish = request.POST.get("publish")
11
12 #当进入编辑页面后点击提交,进入post,对数据进行修改
13 book_obj = Book.objects.filter(id=id).update(title=title, price=price, pub_date=pub_date, publish=publish)
14
15 return redirect("/book")
16
17
18 return render(request, 'changebook.html',{"book_obj":book_obj})
总结:
1.要在html文件里根据数据库生成标签需熟练运用模板语法for:
1 {% for person in person_list %} # 循环对象列表2 <p>{{ forloop.counter }} {{ person.name }},{{ person.age }}</p> # 两个变量之间可设置不同的分隔符,forloop为索引
{% empty %} #如果列表为空就打印empty后的标签内容5 <p>列表为空</p> 6 {% endfor %}
2.在登录注册界面中,经常运用模板语法if
1 {% if user %}
2 <p>
3 <a href="">hi {{ user }}</a>
4 <a href="">注销</a>
5 </p>
6 {% else %}
7 <p>
8 <a href="">登陆</a>
9 <a href="">注册</a>
10 </p>
11 {% endif %}
3.通常按钮的跳转页面,在views.py中return redirect("/url/")进行重定向 / a标签定义的按钮使用href="/url/"进行页面跳转
4.有按钮的地方就有post访问,则视图函数中通常会进行if request.method对请求进行判断,让网页return到不同的页面