上回说到,我们成功的实现了排课算法并且生成了课表,这次我们就尝试在首页显示课表,并且实现调用排课的认证。
显示课表
显示课表非常的简单,在视图中返回的 context 字典中只有一个键值对,格式如下:
{'grades': [(grade, table)……]}
其中 grades 是要传送到模板中把后面的值对应的元组列表进行显示,元组的第一个元素是某一个 Grade 对象,table 是当前班级的课表,格式为一个二维数组。知道这些写出显示课表的代码就很简单了。
首先是视图层的代码,course_scheduling_system\views.py 代码如下:
from django.shortcuts import render
from xlrd import open_workbook
from.models import Grade
# Create your views here.
def index(request):
workbook = open_workbook('curriculum/班级课表.xls')
context = {'grades': []}
for grade in Grade.objects.all():
sheet = workbook.sheet_by_name(str(grade))
table = [[sheet.cell(row, col).value for col in range(sheet.ncols)]for row in range(sheet.nrows)]
context['grades'].append((grade, table))
return render(request, 'index.html', context)
接下来是模板层,templates\index.html(没有文件或者目录就自己新建)代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>排课系统</title>
</head>
<body>
<h1>排课系统</h1>
<h2>班级课表</h2>
{% for grade in grades %}
<!--suppress HtmlDeprecatedAttribute -->
<table border="1">
<caption>{{ grade.0 }}班级课表</caption>
{% for row_values in grade.1 %}
<tr>
{% for value in row_values %}
<td>{{ value|linebreaksbr }}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
{% endfor %}
</body>
</html>
然后我们就尝试去把视图函数和一个 url 连起来,我们可以直接去编辑 CourseSchedulingSystem\urls.py,代码如下:
from django.contrib import admin
from django.urls import path
from course_scheduling_system.views import index
urlpatterns = [
path('admin/', admin.site.urls),
path('', index)
]
运行一下看看效果,如图所示。
虽然说没有居中啥的,看着很怪,但是能显示出来就可以了,下面我们来实现排课页面的逻辑以及实现。
端午安康
排课页面首先必定要进行认证,认证通过进行排课,认证不通过直接返回用户名密码错误,在排课的过程中需要考虑排课成功还是失败,成功返回排课成功,失败就返回排课失败。逻辑很简单,关键是认证,实现起来非常麻烦,因为管理员密码不是明文,是加密了之后存到数据库中,去框架中找出加密算法简直就是大海捞针,我们不如直接想一下有没有封装好的函数,其实是有的,直接导入就行,代码如下:
from django.contrib.auth import authenticate
导入完成之后就来编写视图函数,代码如下:
def course_scheduling(request):
context = {'result': ''}
if request.method == 'POST':
user = authenticate(username=request.POST['username'], password=request.POST['password'])
if user:
if CourseScheduling().schedule_course():
context['result'] = '排课成功'
else:
context['result'] = '排课失败'
else:
context['result'] = '用户名或密码错误'
return render(request, 'course_scheduling.html', context)
接下来是模板代码,templates\course_scheduling.html 代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>排课系统</title>
</head>
<body>
<h1>排课系统</h1>
{% if result %}
<h2>{{ result }}</h2>
{% endif %}
<form method="post">
{% csrf_token %}
<label>username:<input type="text" name="username"></label>
<label>password:<input type="password" name="password"></label>
<input type="submit" value="排课">
</form>
</body>
</html>
最后和之前一样,配置 URL,去 CourseSchedulingSystem\urls.py 的 urlpattterns 列表中添加一项,如下所示。
path('course_scheduling', course_scheduling)
最后运行一下看看效果(演示截图有点多,我就不截下来了),发现确实是符合逻辑,排课系统已经正式的讲解完成了。
今天的文章有不懂的可以后台回复“加群”,备注:小陈学Python,不备注可是会被拒绝的哦~!