zoukankan      html  css  js  c++  java
  • 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到不同的页面

        

     

  • 相关阅读:
    Leetcode Binary Tree Preorder Traversal
    Leetcode Minimum Depth of Binary Tree
    Leetcode 148. Sort List
    Leetcode 61. Rotate List
    Leetcode 86. Partition List
    Leetcode 21. Merge Two Sorted Lists
    Leetcode 143. Reorder List
    J2EE项目应用开发过程中的易错点
    JNDI初认识
    奔腾的代码
  • 原文地址:https://www.cnblogs.com/QQL-anatkh/p/9444141.html
Copyright © 2011-2022 走看看