Django单表开发流程css
1、建立Django项目:html
(1)cmd下python
1.查看Django版本:python -m django --versionmysql
2.建立Django项目:django-admin startproject mysite(cd到你要建立的文件下)git
3.切换到Django项目目录下,启动Django:python manage.py runserversql
(2)pycharm下数据库
1.New Project:建立新的Django项目(建议在more setting 中,可设置应用application name)django
2、设置settings.py文件:app
(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"), ]
3、为应用配置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
4、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)
5、建立对应的视图函数
(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到不一样的页面