一.新建django项目准备工做html
CMD新建项目命令:django-admin startproject [项目名称]python
pycharm的project目录里新建app命令:python manage.py startapp [app名称]mysql
setting文件下新建app路径sql
1 INSTALLED_APPS = [ 'app01',]
注释掉csrf中间件
1 MIDDLEWARE = [# 'django.middleware.csrf.CsrfViewMiddleware',]
模板文件部署
在newproject目录下新增文件夹templates
更改setting下template的dirs路径
1 TEMPLATES = [ { 'DIRS': [os.path.join(BASE_DIR,'templates')],
setting配置文件添加logging加上日志记录部分,能够在pycharm看到命令
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 }
数据库部署
注释默认sqllte数据库,新增mysql数据库借口
1 DATABASES = { 2 3 'default': { 4 5 'ENGINE': 'django.db.backends.mysql', 6 7 'NAME': 'new_project', #你的数据库名称 8 9 'USER': 'root', #你的数据库用户名 10 11 'PASSWORD': '111111', #你的数据库密码 12 13 'HOST': '', #你的数据库主机,留空默认为localhost 14 15 'PORT': '3306', #你的数据库端口 16 17 } 18 19 } 20
windows系统还得解决数据插入中文乱码的问题:http://www.javashuo.com/article/p-kvahkykc-hn.html
静态文件部署
在newproject路径下新增static文件夹
在setting配置下新增STATICFILES_DIRS路径
1 STATICFILES_DIRS=( os.path.join(BASE_DIR,'app01','static'), )
准备工做完成....
生命周期的流程:
1.发送请求
2.将发送过来的请求到url路由系统里面匹配
3.匹配完成后到views执行函数(FBV模式,或者是CBV模式)
django步骤开始
models操做
在models文件下新建数据库
建立班级表,教师表,学生表三张表
班级表与教师表为多对多关系(创建多对多关系)
班级表与学生表为一对多关系(创建外键)
1 from django.db import models 2 3 # Create your models here. 4 5 class Classes(models.Model): 6 7 """ 8 班级表,男 9 """ 10 title = models.CharField(max_length=32) 11 m=models.ManyToManyField("Teachers") 12 13 class Teachers(models.Model): 14 """ 15 老师表,女 16 """ 17 name= models.CharField(max_length=32) 18 # 本身建立第三张表 19 # class C2T(models.Model): 20 # cid=models.Foreignkey(Classes) 21 # tid=models.Foreignkey(Teachers) 22 23 24 25 class Student(models.Model): 26 username=models.CharField(max_length=32) 27 age=models.IntegerField() 28 gender=models.BooleanField() 29 cs=models.ForeignKey(Classes,on_delete=True) 30 31 32
# 一种方式:本身建立第三张表,在数据库中本身插入值
# class C2T(models.Model):
# cid=models.Foreignkey(Classes)
# tid=models.Foreignkey(Teachers)
django建立第三张表,捆绑Teachers表与Classes表
1 class Student(models.Model): 2 3 username=models.CharField(max_length=32) 4 age=models.IntegerField() 5 gender=models.BooleanField() 还有nullBooleanField选项(能够为空的布尔值) 6 cs=models.ForeignKey(Classes,on_delete=True) 注意:django2.1须要加上on_delete选项,True默认 学生表与班级表为一对多的关系,班级表为多的那个表
建完表以后,mysql新建数据库,create datebase [数据库名称]
在pychram下新建cmd命令
新建表结构,python manage.py makemigrations
再新建,django自动建立表与表关系python manage.py migrate
启动django项目
1 python manage.py runserver [端口号]
路由系统操做
url文件下新建django url路由的路径
1 """new_project URL Configuration 2 3 The `urlpatterns` list routes URLs to views. For more information please see: 4 https://docs.djangoproject.com/en/2.1/topics/http/urls/ 5 Examples: 6 Function views 7 1. Add an import: from my_app import views 8 2. Add a URL to urlpatterns: path('', views.home, name='home') 9 Class-based views 10 1. Add an import: from other_app.views import Home 11 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') 12 Including another URLconf 13 1. Import the include() function: from django.urls import include, path 14 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) 15 """ 16 from django.contrib import admin 17 from django.urls import path 18 19 from app01.views import classes 20 from app01.views import students 21 22 urlpatterns = [ 23 path('admin/', admin.site.urls), 24 path('get_classes/',classes.get_class), 25 path('add_classes/',classes.add_classes), 26 path('del_classes/',classes.del_classes), 27 path('change_classes/', classes.change_classes), 28 29 path('get_students/', students.get_students), 30 path('add_students/', students.add_students), 31 path('del_students/', students.del_students), 32 path('change_students/', students.change_students), 33 34 ] 35 36 37
views操做
为了不views文件下函数太多,删除startproject的views 文件
新建views文件夹,在views文件下新建student,classes,teacher三个文件
classes文件执行的函数数据库
新增班级,删除班级,修改班级
from django.shortcuts import render,redirect from app01 import models def get_class(request): cls_list=models.Classes.objects.all() # 获得classes表里面的全部内容,这一步是为了get_classes.html:{% for row in cls_list %} # for item in cls_list: # print(item.id,item.title,item.m.all()) return render(request,'get_classes.html',{'cls_list':cls_list}) # 返回get_classes.html页面,传入cls_list是为了{% for row in cls_list %}遍历全部班级 def add_classes(request): # 若是是get请求,返回到add_classes.html页面 if request.method == "GET": return render(request,'add_classes.html') elif request.method == "POST": title = request.POST.get('title') models.Classes.objects.create(title=title) return redirect("/get_classes/") # 数据库操做: filter找到nid.delete() # 使用request.GET.get()获得nid,这一步是为了get_classes.html:?nid={{ row.id }} # html:<!--为了删除到某一行,须要精确匹配到id,由于id不会重复,?nid:(nid等于id),--> # <!--{{ row.id(遍历row里面的.id) }}--> def del_classes(request): nid=request.GET.get('nid') models.Classes.objects.filter(id=nid).delete() return redirect('/get_classes/') def change_classes(request): if request.method == "GET": nid=request.GET.get('nid') obj=models.Classes.objects.filter(id=nid).first() # .first()是由于取到的是一个对象集合[{'id':1,'title':'xx班级'},] return render(request,'change_classes.html',{'obj':obj}) elif request.method == "POST": nid=request.GET.get('nid') title = request.POST.get('xxoo') models.Classes.objects.filter(id=nid).update(title=title) return redirect('/get_classes/') def set_teachers(request): if request.method=="GET": nid = request.GET.get('nid') cls_obj=models.Classes.objects.filter(id=nid).first() cls_teacher_list = cls_obj.m.all().values_list('id','name') # 这是找到teachers表的,元祖形式的id跟name(1,'ago'),(2,'ago2') id_list= list(zip(*cls_teacher_list))[0] if list(zip(*cls_teacher_list)) else [] # 当前任课老师的id_list # print(cls_teacher_list) all_teachers_list=models.Teachers.objects.all() # print(all_teachers_list) # for t in all_teachers_list: # if t.id in cls_teacher_list: return render(request, 'set_teachers.html', {'id_list':id_list, 'all_teachers_list':all_teachers_list, 'nid':nid } ) elif request.method=="POST": nid=request.GET.get('nid') ids=request.POST.getlist('teacher_ids') obj=models.Classes.objects.filter(id=nid).first() obj.m.set(ids) return redirect('/get_classes/')
students文件执行的函数新增学生,删除学生,修改学生django
1 from django.shortcuts import render,redirect 2 from app01 import models 3 4 5 def get_students(request): 6 students_list=models.Student.objects.all() 7 # for row in students_list: 8 # print(row.username,row.age,row.gender,row.cs.title,row.cs.id) 9 10 return render(request,"get_students.html",{'students_list':students_list}) 11 12 def add_students(request): 13 14 15 if request.method == "GET": 16 cs_list = models.Classes.objects.all() 17 # cs_list的结果是{['id':1,'title':'xx班'],} 18 for row in cs_list: 19 print(row.id,row.title) 20 return render(request,'add_students.html',{'cs_list':cs_list}) 21 # 传入'cs_list'是为了 22 # <select name="cs"> 23 # {% for row in cs_list %} 24 # <option value='{{ row.id }}'>{{ row.title }}</option> 25 # {% endfor %} 26 # </select> 27 # <select name="cs"> 28 # # {% for row in cs_list %}是为了遍历cs_list里面的id跟title 29 # value='{{ row.id }}'是为了把row.title对应的row.id找出来 30 elif request.method == "POST": 31 u=request.POST.get('username') 32 a=request.POST.get('age') 33 g=request.POST.get('gender') 34 c=request.POST.get('cs') 35 # print(u,a,g,c) 36 models.Student.objects.create( 37 username=u, 38 age=a, 39 gender=g, 40 cs_id=c 41 ) 42 return redirect("/get_students/") 43 # row.id=c,添加到数据表中cs_id 44 45 46 def del_students(request): 47 nid=request.GET.get('nid') 48 # 目的是删除id=1的那条数据,点提交以后会跳转到href="/del_students?nid={{ row.id }}" 49 # 因此把id=nid 50 models.Student.objects.filter(id=nid).delete() 51 return redirect('/get_students/') 52 53 def change_students(request): 54 if request.method == 'GET': 55 nid = request.GET.get('nid') 56 obj = models.Student.objects.filter(id=nid).first() 57 # 这是为了取到POST请求中的网址内容,数据编辑里面的惟一id,找到对应的那一列 58 # 找到Students表中id=nid的学生,结果取第一个,就是id:[{'id':1},{'id':2}] 59 # obj中有当前学生的班级ID=2 obj.cs_id 60 cls_list = models.Classes.objects.values('id', 'title') 61 62 # 找到Classes表中全部的id与title,结果是一个字典 63 # 全部班级ID 班级名称 64 # 1 1班 65 # 2 2班 selected 66 # cls_list是什么类型?QuerySet至关于列表 67 # 【{'id':'cc',title:'xx'},{'id':'',title:'xx'},】 68 # for row in cls_list: 69 # print(row['id']) 70 return render(request, 'change_students.html', {'obj': obj, 'cls_list': cls_list}) 71 # 传入obj是为了 72 # <p><input type="text" name="xxoo" value="{{ obj.username }}"></p> 73 # <p><input type="text" name="xxoo" value="{{ obj.age }}"></p> 74 # 把input框的values值先显示出来,obj.username原始的内容, 75 elif request.method == "POST": 76 nid = request.GET.get('nid') 77 u = request.POST.get('username') 78 a = request.POST.get('age') 79 g = request.POST.get('gender') 80 class_id = request.POST.get('class_id') 81 models.Student.objects.filter(id=nid).update(username=u, age=a, gender=g, cs_id=class_id) 82 return redirect('/students.html') 83 84
templates文件下新建html文件
get_classes.html
显示班级页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ margin:0; padding:0 } </style> </head> <body> <div> <a href="/add_classes/">添加</a> </div> <div> <table border="1"> <thead> <tr> <th>ID</th> <th>名称</th> <th>任课老师</th> <th>操做</th> </tr> </thead> <tbody> {% for row in cls_list %} <tr> <td> {{ row.id }} </td> <td> {{ row.title }} </td> <td> {% for item in row.m.all %} <span>{{ item.name }}</span> {% endfor %} </td> <td> <a href="/del_classes?nid={{ row.id }}">删除</a> |<a href="/change_classes?nid={{ row.id }}">修改</a> |<a href="/set_teachers?nid={{ row.id }}">添加老师</a> </td> </tr> {% endfor %} </tbody> </table> </div> </body> </html>
add_classes.html页面,
新增班级页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <style> 7 *{ 8 margin:0; 9 padding:0 10 } 11 12 </style> 13 14 </head> 15 <body> 16 <form action="/add_classes/" method="POST"> 17 {%csrf_token%} 18 <input type="text" name="title"> 19 <input type="submit" value="提交"> 20 21 </form> 22 23 24 25 </body> 26 </html>
change_classes.html页面,由于修改数据须要新增一个页面
用来修改数据,删除数据不用新增页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <style> 7 *{ 8 margin:0; 9 padding:0 10 } 11 12 </style> 13 14 </head> 15 <body> 16 17 <form action="/change_classes/?nid={{ obj.id }}" method="POST"> 18 {% csrf_token %} 19 <!--<input type="text" value="{{ obj.id }}" style="display:None">--> 20 <input type="text" name="xxoo" value="{{ obj.title }}"> 21 <input type="submit" name="提交"> 22 </form> 23 24 25 26 27 </body> 28 </html>
get_students.html
显示学生页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <style> 7 *{ 8 margin:0; 9 padding:0 10 } 11 12 </style> 13 14 </head> 15 <body> 16 17 <div> 18 <a href="/add_students/">添加</a> 19 </div> 20 <div> 21 <table border="1"> 22 <thead> 23 <tr> 24 <th>ID</th> 25 <th>姓名</th> 26 <th>年龄</th> 27 <th>性别</th> 28 <th>班级</th> 29 <th>编辑</th> 30 </tr> 31 </thead> 32 <tbody> 33 {% for row in students_list %} 34 <tr> 35 <td> 36 {{ row.id }} 37 </td> 38 <td> 39 {{ row.username }} 40 </td> 41 42 <td> 43 {{ row.age }} 44 </td> 45 <td> 46 {{ row.gender }} 47 </td> 48 <td> 49 {{ row.cs.title }} 50 </td> 51 <td> 52 <a href="/del_students?nid={{ row.id }}">删除</a> 53 |<a href="/change_students?nid={{ row.id }}">修改</a> 54 </td> 55 56 </tr> 57 {% endfor %} 58 </tbody> 59 </table> 60 </div> 61 62 63 64 </body> 65 </html>
add_students.html
添加学生页面
1 2 1 <!DOCTYPE html> 3 2 <html lang="en"> 4 3 <head> 5 4 <meta charset="UTF-8"> 6 5 <title>Title</title> 7 6 <style> 8 7 *{ 9 8 margin:0; 10 9 padding:0 11 10 } 12 11 13 12 </style> 14 13 15 14 </head> 16 15 <body> 17 16 18 17 <div> 19 18 <a href="/add_students/">添加</a> 20 19 </div> 21 20 <div> 22 21 <table border="1"> 23 22 <thead> 24 23 <tr> 25 24 <th>ID</th> 26 25 <th>姓名</th> 27 26 <th>年龄</th> 28 27 <th>性别</th> 29 28 <th>班级</th> 30 29 <th>编辑</th> 31 30 </tr> 32 31 </thead> 33 32 <tbody> 34 33 {% for row in students_list %} 35 34 <tr> 36 35 <td> 37 36 {{ row.id }} 38 37 </td> 39 38 40 39 <td> 41 40 {{ row.title }} 42 41 </td> 43 42 <td> 44 43 <a href="/del_students?nid={{ row.id }}">删除</a> 45 44 |<a href="/change_students?nid={{ row.id }}">修改</a> 46 45 </td> 47 46 48 47 </tr> 49 48 {% endfor %} 50 49 </tbody> 51 50 </table> 52 51 </div> 53 52 54 53 55 54 56 55 </body> 57 56 </html>View Code
change_students.html
修改学生页面
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Title</title> 6 <style> 7 *{ 8 margin:0; 9 padding:0 10 } 11 12 </style> 13 14 </head> 15 <body> 16 17 <form action="/change_students/?nid={{ obj.id }}" method="POST"> 18 <!--obj = models.Student.objects.filter(id=nid).first() 19 # 这是为了取到POST请求中的网址内容,数据编辑里面的惟一id,找到对应的那一列 20 # 找到Students表中id=nid的学生,结果取第一个,就是id:[{'id':1},{'username':xxoo},{'age':xx},{'gender':True},{'cs_id':x}] 21 # obj中有当前学生的班级ID=2 obj.cs_id--> 22 {% csrf_token %} 23 <!--<input type="text" value="{{ obj.id }}" style="display:None">隐藏是由于修改学生页面不用显示学生id--> 24 <p><input type="text" name="xxoo" value="{{ obj.username }}"></p> 25 <p><input type="text" name="xxoo" value="{{ obj.age }}"></p> 26 <p> 27 {% if obj.gender %} 28 <!--若是gender是已经选择男的,就把女的留空--> 29 男:<input type="radio" name="gender" checked="checked" value="1" /> 30 女:<input type="radio" name="gender" value="0" /> 31 {% else %} 32 <!--若是gender已经选择女的,就把男的留空--> 33 男:<input type="radio" name="gender" value="1" /> 34 女:<input type="radio" name="gender" value="0" checked="checked" /> 35 {% endif %} 36 37 </p> 38 <p> 39 <select name="class_id"> 40 {% for row in cls_list %} 41 <!--cls_list = models.Classes.objects.values('id', 'title')--> 42 <!--# 找到Classes表中全部的id与title,结果是一个字典--> 43 {% if row.id == obj.cs_id %} 44 <!--若是班级表的id(row.id) 等于 学生表的cs(外键=班级表_id)_id两个相等--> 45 <option value="{{ row.id }}" selected="selected" >{{ row.title }}</option> 46 <!--那么就'selected' 已选择的选项出来 ,else也显示其余没选择的选项--> 47 {% else %} 48 <option value="{{ row.id }}">{{ row.title }}</option> 49 {% endif %} 50 {% endfor %} 51 </select> 52 </p> 53 54 <input type="submit" name="提交"> 55 </form> 56 57 58 </body> 59 </html>