一.新建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>