您的当前位置:首页正文

Django小实例S1简易学生选课管理系统11学生课程业务实现

来源:九壹网
Django⼩实例S1简易学⽣选课管理系统11学⽣课程业务实现

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

{% csrf_token %}

{% if view_kind != \"select\"%}

{% endif %}

{% if view_kind != \"withdraw\"%}

{% endif %}

{% if view_kind != \"is_end\"%}

{% endif %}

{% if view_kind != \"current\"%}

{% endif %}

{% if view_kind == \"select\"%} 选课

{% 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 %}

{% if view_kind == \"is_end\" %}

{# end course show student course #}

{% for sc in course_list %}

{% if sc.rating == None %}

{% else %}

{% endif %}

{% endfor %} {% else %}

{% for course in course_list %}

{% endfor %} {% 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 }}--

onclick='window.open(\"{% url 'evaluate' sc.id %}\")' />

{{ 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 %}

评教

{% csrf_token %} {{form.as_p}}

{% 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 %}

课程详情

  • 课程编号 {{ object.course.id }}
  • 课程名 {{ object.course.name }}
  • 学分 {{ object.course.credit }}
  • 课程⼈数/最⼤⼈数 {{ object.course.get_current_count }}/{{ object.course.max_number }}
  • 年份 {{ object.course.year }}
  • 学期 {{ object.course.get_semester_display }}
  • 教师 {{ object.course.teacher.name }}
  • 上课时间

    {% for schedule in object.course.get_schedules %}

    {{ schedule }}
    {{ schedule }}
    {% endfor %}
  • 得分

    {% if object.scores != None %}{{ object.scores }}{% else %} - {% endif %}

  • 评语

    {% if object.comments != None %}{{ object.comments }}{% else %} - {% endif %}

  • 学⽣评分 {% if object.rating != None %}{{ object.rating }}{% 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('/', home, name=\"course\"),

path('teacher/create_course', create_course, name=\"create_course\"),

path('teacher/view_detail/', view_detail, name=\"view_detail\"),

path('teacher/create_schedule/', create_schedule, name=\"create_schedule\"), path('teacher/delete_schedule/', delete_schedule, name=\"delete_schedule\"), path('teacher/score/', ScoreUpdateView.as_view(), name=\"score\"),

path('teacher/handle_course//', handle_course, name=\"handle_course\"), path('student/view/', view_course, name=\"view_course\"),

path('student/operate//', operate_course, name=\"operate_course\"), path('student/evaluate/', RateUpdateView.as_view(), name=\"evaluate\"),

path('student/view_detail/', StudentCourseDetailView.as_view(), name=\"sview_detail\"),]

6 - 效果

选课页⾯

当前课程页⾯

因篇幅问题不能全部显示,请点此查看更多更全内容

Top