当前位置:首页 > 技术 > 正文内容

使用Django实现课程展示、学生注册与缓存优化

访客 技术 2026年6月17日 1

课程展示与缓存优化

本章将介绍如何在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
标签: django

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。