一.新建django项目准备工作

CMD新建项目命令:django-admin startproject [项目名称]

pycharm的project目录里新建app命令:python manage.py startapp [app名称]

setting文件下新建app路径

  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系统还得解决数据插入中文乱码的问题:https://blog.csdn.net/qq_36533690/article/details/82184720
静态文件部署
在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

新建表结构,

再新建
python manage.py migrate

,django自动创建表与表关系

启动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文件执行的函数新增学生,删除学生,修改学生

  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>
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>

django_ORM学生管理系统的更多相关文章

  1. 【IOS开发笔记02】学生管理系统

    端到端的机会 虽然现在身处大公司,但是因为是内部创业团队,产品.native.前端.服务器端全部坐在一起开发,大家很容易做零距离交流,也因为最近内部有一个前端要转岗过来,于是手里的前端任务好像可以抛一 ...

  2. C程序范例(2)——学生管理系统”链表“实现

    1.对于学生管理系统,能够实现的方法有许多,但是今天我们用链表的方法来实现.虽然初学者很可能看不懂,但是不要紧,这是要在整体的系统的学习完C语言之后,我才编写出的程序.所以大家不必要担心.在这里与大家 ...

  3. jsp学习之基于mvc学生管理系统的编写

    mvc开发模式:分别是 model层 view层 Control层 在学生管理系统中,model层有学生实体类,数据访问的dao层,view层主要是用于显示信息的界面,Control层主要是servl ...

  4. java版本的学生管理系统

    import java.awt.BorderLayout; import java.awt.Color; import java.awt.Frame; import java.awt.event.Ac ...

  5. 学生管理系统-火车订票系统 c语言课程设计

    概要: C 语言课程设计一---学生管理系统 使使用 C 语言实现学生管理系统.系统实现对学生的基本信息和考试成绩的 管理.采用终端命令界面,作为系统的输入输出界面.采用文件作为信息存储介质. 功能描 ...

  6. Java学生管理系统项目案例

    这是一个不错的Java学生管理系统项目案例,希望能够帮到大家的学习吧. 分代码如下 package com.student.util; import java.sql.Connection; impo ...

  7. Java+Mysql+学生管理系统

    最近正在学java和数据库,想起以前写的学生管理系统,都是从网上下载,敷衍了事.闲来无事,也就自己写了一个,不过功能实现的不是很多. 开发语言:java: 开发环境:Mysql, java: 开发工具 ...

  8. JDBC学生管理系统--处理分页显示

    分页的思想: 假设一共有104条数据,每页显示10条数据: select * from student limit 0,10; 页数是index,第index页,对应的sql语句是: select * ...

  9. JDBC-简单的学生管理系统-增删改查

    结构:三层架构--mvc 三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑. 比如将数据库操作代码封装到一层中,提供一些方法根据参数直 ...

随机推荐

  1. 【Leetcode】【Medium】Find Minimum in Rotated Sorted Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  2. 设置导出的excel数据

    /** * 设置导出的excel数据 * @param type $objPHPExcel * @param type $colModel * @param type $grid */public f ...

  3. dbms_randon package

    reference to wbsite:http://zhangzhongjie.iteye.com/blog/1948930#comments DBMS_RANDON PACKAGE: Define ...

  4. July 08th 2017 Week 27th Saturday

    You are never wrong to do the right thing. 坚持做对的事情,永远都不会错. I think the translation may be not precis ...

  5. linux shell数据重定向

    标准输入 (stdin) :代码为 0 ,使用 < 或 << :标准输出 (stdout):代码为 1 ,使用 > 或 >> :标准错误输出(stderr):代码为 ...

  6. excel 在web导入到数据库的操作方法

    这个操作的大致步骤是把本地文件存入到服务器端,然后再读取服务端的文件并且使用NPOI这个第三方的插件去读取文件导入到数据库批量插入需要注意的是,前端需要使用form包裹type=file的文件标签,并 ...

  7. 百度地图Label 样式 setStyle

    最近一直在整百度地图,发现一个小问题: 创建文本标注对象设置样式的时候,其中的backgroundColor属性居然还支持透明啊,不过改变数值好像对效果没有影响 var numLabel = new ...

  8. 4.30-5.1cf补题

    //yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...

  9. 在编译器中调试spark程序处理

    在IDEA中调试spark程序会报错 18/05/16 07:33:51 WARN NativeCodeLoader: Unable to load native-hadoop library for ...

  10. PHP---练习-----留言板

    题目::留言显示 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://ww ...