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

        

     

  • 相关阅读:
    E230的Android历程
    Web.config
    程序集和命名空间 转载
    CSS 得到图片 为什么是负 值。
    JQUERY中 GET与POST方法的区别 Request.QueryString Request.Form区别
    JS中scrollLeft(right,top,bottom)的用法和特点
    ashx是什么文件
    自己写了个 logO图片上 显示问题则CSS样式。CSS可是真强大啊。
    jquery + ashx DropDownList 二级
    CSS与超链接<a><A>的恩怨情仇。。。
  • 原文地址:https://www.cnblogs.com/QQL-anatkh/p/9444141.html
Copyright © 2011-2022 走看看