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>
相关文章
相关标签/搜索