django_ORM學生管理系統

一.新建django項目準備工做html

CMD新建項目命令:django-admin startproject [項目名稱]python

pycharm的project目錄裏新建app命令:python manage.py startapp [app名稱]mysql

 

setting文件下新建app路徑sql

  1 INSTALLED_APPS = [    'app01',]
View Code
註釋掉csrf中間件
  1 MIDDLEWARE = [# 'django.middleware.csrf.CsrfViewMiddleware',]
View Code
模板文件部署
在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 }
View Code
數據庫部署
註釋默認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 
View Code
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'),                  )
View Code
準備工做完成....

生命週期的流程:
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 
View Code
# 一種方式:本身建立第三張表,在數據庫中本身插入值
# 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
新建表結構,
再新建
 
 
 
 
python manage.py migrate
,django自動建立表與表關係
啓動django項目
  1 python manage.py runserver [端口號]
View Code
路由系統操做
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 
View Code
 
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>
View Code
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>
View Code
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>
View Code
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>
相關文章
相關標籤/搜索