Django ⼩实例S1 简易学⽣选课管理系统 第11节——学⽣课程业务实现作者⾃我介绍:,,。
课程模块中,学⽣需要拥有的功能有:
查看课程列表选课撤课结课后评教
1 - 查看课程列表
学⽣可以按类别view_kind查看课程,view_kind分为
current: 查看当前课程is_end: 查看结课课程select: 可选课的withdraw: 可撤课的
新建学⽣查看课程的模板templates/course/student/home.html如下
{% extends \"course/nav.html\" %}
{% block title %}HomePage{% endblock %}{% block content %}
{% elif view_kind == \"withdraw\"%} 撤课
{% elif view_kind == \"is_end\"%} 查看结课课程
{% elif view_kind == \"current\"%} 查看当前课程 {% endif %}
课程编号 | 名称 | 学分 | {% if view_kind == \"is_end\" %}年份学期 | {% else %}当前⼈数/ 最⼤⼈数 | 年份 | 学期 | {% endif %}教师 | {% if view_kind == \"is_end\" %}得分 | 评语 | 学⽣评分 | 学⽣评价 | 操作 | {% else %}上课时间 | 操作 | {% endif %}
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
{{ sc.course.id }} | {{ sc.course.name }} | {{ sc.course.credit }} | {{ sc.course.year }} {{ sc.course.get_semester_display }} | {{ sc.course.teacher.name }} | {{ sc.scores }} | {{ sc.comments }} | {% if sc.rating == None %}- | - | onclick='window.open(\"{% url 'evaluate' sc.id %}\")' /> | {% else %}{{ sc.rating }} | {{ sc.assessment }} |
| ||
{{ course.id }} | {{ course.name }} | {{ course.credit }} | {{ course.get_current_count }}/{{ course.max_number }} | {{ course.year }} | {{ course.get_semester_display }} | {{ course.teacher.name }} | {% for schedule in course.get_schedules %} {{ schedule }} {% endfor %} | {% if view_kind == \"select\"%} onclick='window.open(\"{% url 'operate_course' course.id 'select' %}\")' /> {% endif %} {% if view_kind == \"withdraw\"%} onclick='window.open(\"{% url 'operate_course' course.id 'withdraw' %}\")' /> {% endif %} {% if view_kind == \"current\"%} - {% endif %} |
{% endblock %}
然后在course/views.py中添加代码如下
def view_course(request, view_kind): \"\"\"
:param view_kind:
current: 查看当前课程 is_end: 查看结课课程 select: 选课 withdraw: 撤课 \"\"\"
user = get_user(request, \"student\") if not user:
return redirect(reverse(\"login\ is_search = False search_key = \"\"
if request.method == \"POST\":
search_key = request.POST.get(\"search\") if search_key:
is_search = True info = {
\"name\": user.name, \"kind\": \"student\ }
course_list = []
if view_kind in [\"select\ if view_kind == \"select\": q = Q(status=2) if is_search:
q = q & (Q(name__icontains=search_key) | Q(teacher__name__icontains=search_key)) course_list = Course.objects.filter(q)
my_course = StudentCourse.objects.filter(Q(student=user) & Q(with_draw=False)) my_cids = [c.course.id for c in my_course]
course_list = [c for c in course_list if c.id not in my_cids] else:
q = Q(student=user) & Q(with_draw=False) if is_search:
q = q & (Q(name__icontains=search_key) | Q(teacher__name__icontains=search_key)) my_course = StudentCourse.objects.filter(q) if view_kind == \"current\":
course_list = [c.course for c in my_course if c.course.status < 4] elif view_kind == \"withdraw\":
course_list = [c.course for c in my_course if c.course.status == 2] elif view_kind == \"is_end\":
course_list = [c for c in my_course if c.course.status >= 4] else:
return HttpResponse(INVALID_REQUEST_METHOD) context = { 'info': info,
'view_kind': view_kind, 'course_list': course_list }
if is_search:
context[\"search_key\"] = search_key
return render(request, 'course/student/home.html', context)
课程主页即学⽣的个⼈主页,故修改course/views.py中的原视图⽅法student_home为def student_home(request):
return redirect(reverse(\"view_course\
2 - 选课撤课
选课是新建⼀个学⽣课程关系记录,撤课则是修改对应的学⽣课程关系记录。即学⽣有两种操作课程⽅法,operate_kind如下:
select: 选课withdraw: 撤课
如果⽹页请求发送的⽅法不在这两种⾥⾯,则不符合规范,同时需要将这⼀信息通过响应返回告知浏览器。故在constants.py中添加ILLEGAL_KIND = \"Illegal kind for you.\"在course/views.py中,导⼊ILLEGAL_KIND,然后添加代码如下# 在开头导⼊timezone
from django.utils import timezone
def operate_course(request, operate_kind, course_id): \"\"\"
:param operate_kind: select: 选课 withdraw: 撤课 \"\"\"
user = get_user(request, \"student\") if not user:
return redirect(reverse(\"login\
if operate_kind not in [\"select\ return HttpResponse(ILLEGAL_KIND) elif operate_kind == \"select\":
course = Course.objects.filter(pk=course_id).get()
new_course = StudentCourse(student=user, course=course) new_course.save()
elif operate_kind == \"withdraw\":
q = Q(course__id=course_id) & Q(student=user) & Q(with_draw=False) course = StudentCourse.objects.filter(q).get() course.with_draw = True
course.with_draw_time = timezone.now() course.save()
return redirect(reverse(\"view_course\
3 - 结课后评教
学⽣给⽼师评教和⽼师给学⽣评分的后端逻辑是⼀样的,都是修改学⽣课程关系表内的数据。
先在course/forms.py中添加
class RateForm(forms.ModelForm): class Meta:
model = StudentCourse
fields = [\"course\ course = forms.CharField(label=\"课程\ scores = forms.IntegerField(label=\"成绩\
comments = forms.CharField(label=\"⽼师评价\ def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs)
self.initial['course'] = self.instance.course self.initial['scores'] = self.instance.scores
self.initial['comments'] = self.instance.comments def clean_course(self): return self.initial['course'] def clean_scores(self): return self.initial['scores'] def clean_comments(self): return self.initial['comments']
然后添加模板⽂件templates/course/student/rating.html:
{% extends \"course/nav.html\" %}{% block title %}评教{% endblock %}{% block content %}
{% endblock %}
再在course/cbvs.py中导⼊RateForm类,然后添加代码如下class RateUpdateView(UpdateView): model = StudentCourse form_class = RateForm
template_name = 'course/student/rating.html' def get(self, request, *args, **kwargs): self.object = self.get_object()
info = {}
return_url = reverse(\"view_course\ if self.object:
student = self.object.student info = {
\"name\": student.name, \"kind\": \"student\ }
return self.render_to_response(self.get_context_data(info=info, return_url=return_url)) def get_success_url(self):
return reverse(\"view_course\
4 - 学⽣课程详情页
这个使⽤CBVs实现起来最快
先添加模板templates/course/student/course.html如下
{% extends \"course/nav.html\" %}
{% block title %}课程详情{% endblock %}{% block content %}
{% for schedule in object.course.get_schedules %}
{% if object.scores != None %}{{ object.scores }}{% else %} - {% endif %}
{% if object.comments != None %}{{ object.comments }}{% else %} - {% endif %}
{% if object.assessment != None %}{{ object.assessment }}{% else %} - {% endif %}
{% endblock %}
再在course/cbvs.py中添加代码如下
class StudentCourseDetailView(DetailView): model = StudentCourse
template_name = 'course/student/course.html' def get(self, request, *args, **kwargs): self.object = self.get_object()
context = self.get_context_data(object=self.object) if self.object:
context[\"info\"] = {
\"name\": self.object.student.name, \"kind\": \"student\ }
return self.render_to_response(context)
5 - 添加路由
上⾯已经把学⽣需要的视图⽅法全部实现完毕了,接下来就是添加到路由⾥⾯。修改后的course/urls.py如下
from django.urls import pathfrom course.views import *
from course.cbvs import ScoreUpdateView, RateUpdateView, StudentCourseDetailView
urlpatterns = [
path(' path('teacher/create_course', create_course, name=\"create_course\"), path('teacher/view_detail/ path('teacher/create_schedule/ path('teacher/handle_course/ path('student/operate/ path('student/view_detail/ 6 - 效果 选课页⾯ 当前课程页⾯ 因篇幅问题不能全部显示,请点此查看更多更全内容