使用Django实现课程展示、学生注册与缓存优化
课程展示与缓存优化
本章将介绍如何在Django中实现课程展示页面、学生注册系统以及缓存优化。主要内容包括:
- 创建课程展示视图。
- 实现学生注册和选课功能。
- 渲染课程内容并支持多种媒体类型。
- 通过Memcached优化性能。
1. 展示课程列表
首先,我们需要展示所有可用的课程,并允许用户按主题筛选。以下是实现步骤:
# courses/views.py
from django.db.models import Count
from django.views.generic import View
from .models import Subject, Course
class CourseListView(View):
template_name = 'courses/course/list.html'
def get(self, request, subject=None):
subjects = Subject.objects.annotate(total_courses=Count('course_set'))
courses = Course.objects.annotate(total_modules=Count('module_set'))
if subject:
subject_instance = get_object_or_404(Subject, slug=subject)
courses = courses.filter(subject=subject_instance)
return render(request, self.template_name, {
'subjects': subjects,
'subject': subject_instance if subject else None,
'courses': courses
})
接下来,在`urls.py`中配置路由:
# educa/urls.py
from django.urls import path
from courses.views import CourseListView
urlpatterns = [
path('', CourseListView.as_view(), name='course_list'),
path('subject//', CourseListView.as_view(), name='course_list_subject'),
]
2. 学生注册与选课
为了允许学生注册并选择课程,我们创建一个新的应用`students`:
python manage.py startapp students
编辑`settings.py`激活新应用:
INSTALLED_APPS += ['students.apps.StudentsConfig']
然后定义注册视图:
# students/views.py
from django.contrib.auth.forms import UserCreationForm
from django.urls import reverse_lazy
from django.views.generic.edit import CreateView
class StudentRegistrationView(CreateView):
form_class = UserCreationForm
template_name = 'students/student/registration.html'
success_url = reverse_lazy('student_course_list')
def form_valid(self, form):
response = super().form_valid(form)
user = authenticate(username=form.cleaned_data['username'], password=form.cleaned_data['password1'])
login(self.request, user)
return response
接着,为选课功能添加逻辑:
# courses/models.py
class Course(models.Model):
# ...
students = models.ManyToManyField(User, related_name='enrolled_courses', blank=True)
# students/forms.py
from django import forms
from courses.models import Course
class EnrollForm(forms.Form):
course = forms.ModelChoiceField(queryset=Course.objects.all(), widget=forms.HiddenInput)
# students/views.py
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import FormView
class EnrollCourseView(LoginRequiredMixin, FormView):
form_class = EnrollForm
def form_valid(self, form):
course = form.cleaned_data['course']
course.students.add(self.request.user)
return super().form_valid(form)
def get_success_url(self):
return reverse_lazy('student_course_detail', args=[self.kwargs['pk']])
3. 渲染课程内容
通过多对多关系,学生可以访问已选课程的内容。以下是如何处理不同类型的课程内容:
# courses/models.py
from django.template.loader import render_to_string
class ContentBaseModel(models.Model):
def render_content(self):
return render_to_string(f'courses/content/{self.__class__.__name__.lower()}.html', {'item': self})
同时,为每种内容类型创建模板文件:
# courses/templates/courses/content/text.html
{{ item.text|linebreaks }}
# courses/templates/courses/content/file.html
<a href="{{ item.file.url }}" download>Download File</a>
# courses/templates/courses/content/image.html
<img src="{{ item.image.url }}" alt="{{ item.title }}">
# courses/templates/courses/content/video.html
{% load embed_video_tags %}
{% video item.video 'small' %}
4. 缓存优化
最后,我们使用Memcached来缓存查询结果和视图输出:
# settings.py
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': '127.0.0.1:11211',
}
}
# courses/views.py
from django.core.cache import cache
class CachedCourseListView(CourseListView):
def get(self, request, *args, **kwargs):
cached_data = cache.get('all_courses')
if not cached_data:
cached_data = super().get(request, *args, **kwargs)
cache.set('all_courses', cached_data, timeout=600)
return cached_data