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到不同的页面

    

 

原文地址:https://www.cnblogs.com/QQL-anatkh/p/9444141.html