一、创建django项目以及app
1.在pycharm终端下面按照你的路径创建或者cmd创建项目
2.创建app
创建好之后stu项目下 setting文件里添加app
二、配置路由以及views
1.配置主路由(url) 以及根路由(url) 在app里面创建urls.py文件
主路由文件以及根路由文件:
from django.contrib import admin
from django.urls import path, include
from django.conf.urls import url
urlpatterns = [
path('admin/', admin.site.urls),
url(r'student/', include('stuapp.urls'))
]
2.这里同时在stuapp文件夹下创建views.py(来进行逻辑的处理)同时将views文件导入
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.student_register),
]
3.在views文件中渲染页面 首先在stuapp下创建templates文件夹 再文件夹下创建register.html文件(templates是django项目setting下默认存放页面的文件夹名)
代码如下:
from django.shortcuts import render
def student_register(request):
if request.method == 'GET':
return render(request, 'register.html')
else:
retrun None
OK 这里我们可以通过127.0.0.1:8000/student 访问到这个register.html 页面
下面是register代码:(记得在表单中添加{% csrf_token %}不然会报错 为了防止跨域攻击)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>注册</title>
</head>
<body>
<form action="/student/" method="post">
{% csrf_token %}
<p>
<label for="sn">姓名:</label><input type="text" name="sname" id="sn"/>
</p>
<p>
<label for="sc">所属班级:</label>
<select name="cname" id="sc">
<option value="计算机科学与技术一班">计算机科学与技术一班</option>
<option value="计算机科学与技术二班">计算机科学与技术二班</option>
<option value="软件一班">软件一班</option>
<option value="软件二班">软件二班</option>
</select>
</p>
<p>
<label>选课</label>
<input type="checkbox" name="courname" value="Python"/>Python  
<input type="checkbox" name="courname" value="Java"/>Java  
<input type="checkbox" name="courname" value="Html5"/>Html5  
</p>
<p>
<input type="submit" value="注册"/>
</p>
</form>
</body>
</html>
终端输入:python manage.py runserver启动服务器 访问127.0.0.1:8000/student
效果图如下:
三、连接mysql数据库 创建模型类对数据库进行操作
1.进入项目下setting.py文件 修改database(数据库里面得先创建stu数据库)
2.创建模型类(这里创建三张表 学生 班级 课程 学生和班级一对一关系 学生和课程多对多关系)
代码如下:
from django.db import models
# Create your models here.
#数据库表之间的关系 班级表 课程表 学生表(学生与班级关系一对多:外键参照班级表 学生与课程关系多对多:manytomanyfiled(Course))
#关系多对多 会创建新的表存放 两个表的autofiled id字段 来表示多对多关系
class Clazz(models.Model):
cno = models.AutoField(primary_key=True)
cname = models.CharField(max_length=30)
def __str__(self):
return u'班级:%s', self.cname
class Course(models.Model):
cour_no = models.AutoField(primary_key=True)
cour_name = models.CharField(max_length=30)
def __str__(self):
return u'课程:%s', self.cour_name
class Student(models.Model):
sno = models.AutoField(primary_key=True)
sname = models.CharField(max_length=30)
sclass = models.ForeignKey(Clazz, on_delete=models.CASCADE)
cour = models.ManyToManyField(Course)
def __str__(self):
return u'姓名:%s', self.sname
3.将页面数据插入数据库
views代码如下:
from django.shortcuts import render
from .models import *
from django.http import HttpResponse
# Create your views here.
def student_register(request):
if request.method == 'GET':
return render(request, 'register.html')
else:
# 接收页面参数 姓名 班级 选课 没有返回空
sname = request.POST.get('sname', '')
sclass = request.POST.get('cname', '')
courname = request.POST.getlist('courname', [])
# 将数据写入数据库
flag = registerStu(sname, sclass, *courname)
if flag:
return HttpResponse("注册成功")
return HttpResponse("注册失败")
# 插入数据到数据库
def registerStu(sname, cname, *courname):
# 插入班级表数据
cls = getclass(cname)
# 插入课程数据
courlist = getcourList(*courname)
stu = Student.objects.create(sname=sname, sclass=cls)
# 插入中间表数据
stu.cour.add(*courlist)
return True
# 通过班级名获取班级对象 有则获取没有则创建
#bug:
def getclass(cname):
try:
cls = Clazz.objects.get(cname=cname)
except Clazz.DoesNotExist:
cls = Clazz.objects.create(cname=cname)
return cls
# 获取课程列表
def getcourList(*courname):
courList = []
for i in courname:
try:
c = Course.objects.get(cour_name=i)
except Course.DoesNotExist:
c = Course.objects.create(cour_name=i)
courList.append(c)
return courList
4.效果展示:
mysql数据库:
OK 这里注册成功了 下面显示学生信息:
四、显示所有班级信息 以及班级详情信息
1.同样添加根路由 创建html文件 在views下做逻辑判断以及渲染页面
2.代码显示:
showall.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示所有信息</title>
</head>
<body>
<table border="1" cellspacing="0" width="500px">
<tr>
<th>编号</th>
<th>班级名称</th>
<th>操作</th>
</tr>
{% for c in cls %}
<tr>
<!-- forloop.counter模板语法for的一种用法 表示当前循环的次数 -->
<td>{{forloop.counter}}</td>
<td>{{c.cname}}</td>
<td>
<a href="/student/getstu/?cno={{ c.cno }}">详情</a>
</td>
</tr>
{% endfor %}
</table>
</body>
</html>
stulist.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>显示详情</title>
</head>
<body>
<table border="1" cellspacing="0" width="500px">
<tr>
<th>编号</th>
<th>姓名</th>
<th>班级名称</th>
<th>课程名称</th>
</tr>
{% for stu in stus %}
<tr>
<!-- forloop.counter模板语法for的一种用法 表示当前循环的次数 -->
<td>{{forloop.counter}}</td>
<td>{{stu.sname}}</td>
<td>{{stu.sclass.cname}}</td>
<td>
{% for cou in stu.cour.all %}
{{cou.cour_name}}
{% endfor %}
</td>
</tr>
{% endfor %}
</table>
</body>
</html>
views代码:
# 显示所有班级信息
def showall_stu(request):
# 查询班级表中所有数据
cls = Clazz.objects.all()
return render(request, 'showall.html', {'cls': cls})
#显示当前班级下的所有学生信息
def getstu(request):
cno = request.GET.get('cno', '')
no = int(cno)
#根据班级编号查询学生信息
stus = Clazz.objects.get(cno=no).student_set.all()
return render(request, 'stulist.html', {'stus': stus})
3.效果展示: