Django打造自己的在线教育网站7

课程详情页面

course app中 urls

from apps.courses.views import  CourseDetailView

url(r'^(?P<course_id>\d+)/$', CourseDetailView.as_view(), name="detail"),

course app中 views

class CourseDetailView(View):
    def get(self, request, course_id, *args, **kwargs):
        """
        获取课程详情
        """
        course = Course.objects.get(id=int(course_id))
        course.click_nums += 1
        course.save()

        return render(request, "course-detail.html", {
            "course":course,
        }) 

course-detail.html

结构: content中有两个section



面包屑

{% block custom_bread %}
<section>
    <div class="wp">
        <ul  class="crumbs">
            <li><a href="{% url 'index' %}">首页</a>></li>
            <li><a href="{% url 'course:list' %}">公开课</a>></li>
            <li>课程详情</li>
        </ul>
    </div>
</section>
{% endblock %}

配置课程列表超链接至课程详细

打开course-list.html

<div class="left">
<div class="picbox">
    <div class="tb-booth tb-pic">
        <img width="440" height="445" src="{{course.image.url }}" class="jqzoom" />
    </div>
</div>
<div class="des">
    <h1 title="{{course.name}}">{{course.name}}</h1>
    <span class="key">{{ course.desc }}</span>
    <div class="prize">
        <span class="fl">难度:<i class="key">{{ course.get_degree_display }}</i></span>
        <span class="fr">学习人数:{{course.students}}</span>
    </div>
    <ul class="parameter">
        <li><span class="pram word3">时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;长:</span><span>{{ course.learn_times }}</span></li>
        <li><span class="pram word3">章&nbsp;节&nbsp;数:</span><span>{{ course.lesson_nums }}</span></li>
        <li><span class="pram word3">课程类别:</span><span title="">{{ course.category }}</span></li>
        <li class="piclist"><span class="pram word4">学习用户:</span>

                <span class="pic"><img width="40" height="40" src="/static/media/image/2016/12/default_big_14.png"/></span>

        </li>
    </ul>
    <div class="btns">
        <div class="btn colectgroupbtn"  id="jsLeftBtn">
              收藏
        </div>
            <div class="buy btn"><a style="color: white" href="course-video.html">开始学习</a></div>
    </div>
</div>

其中{{ course.lesson_nums }}章节数是通过Course类中的lesson_nums 方法动态统计章节数字

课程收藏和机构收藏展示实现


在course应用中的views.py中更新如下代码

from apps.operations.models import UserFavorite
# 获取收藏状态
has_fav_course = False
has_fav_org = False
if request.user.is_authenticated:
    if UserFavorite.objects.filter(user=request.user, fav_id=course.id, fav_type=1):
        has_fav_course = True
    if UserFavorite.objects.filter(user=request.user, fav_id=course.course_org.id, fav_type=2):
        has_fav_org = True

用户收藏点击实现

打开course-detail.html添加ajax请求代码

{% block custom_js %}
<script type="text/javascript">
//收藏分享
function add_fav(current_elem, fav_id, fav_type){
    $.ajax({
        cache: false,
        type: "POST",
        url:"{% url 'op:fav' %}",
        data:{'fav_id':fav_id, 'fav_type':fav_type},
        async: true,
        beforeSend:function(xhr, settings){
            xhr.setRequestHeader("X-CSRFToken", "{{ csrf_token }}");
        },
        success: function(data) {
            if(data.status == 'fail'){
                if(data.msg == '用户未登录'){
                    window.location.href="{% url 'login' %}";
                }else{
                    alert(data.msg)
                }
            }else if(data.status == 'success'){
                current_elem.text(data.msg)
            }
        },
    });
}
$(document).ready(function() {
    $('#jsLeftBtn').on('click', function () {
        add_fav($(this), {{ course.id }}, 1);
    });
});

$(document).ready(function() {
    $('#jsRightBtn').on('click', function(){
        add_fav($(this), {{ course.course_org.id }}, 2);
    });
});
</script>
{% endblock %}

无论点击左侧收藏和右侧收藏都是请op下面的fav
项目urls增加

# 用户相关操作
url(r'^op/', include(('apps.operations.urls', "operations"), namespace="op")),

operations下面urls

from django.conf.urls import url
from apps.operations.views import AddFavView
urlpatterns = [
    url(r'^fav/$', AddFavView.as_view(), name="fav"),
]

forms.py

import re

from django import forms
from apps.operations.models import UserFavorite


class UserFavForm(forms.ModelForm):
    class Meta:
        model = UserFavorite
        fields = ["fav_id", "fav_type"]

views.py

from django.views.generic import View
from django.http import JsonResponse
from django.shortcuts import render

from apps.operations.forms import UserFavForm
from apps.operations.models import UserFavorite
from apps.courses.models import Course
from apps.organizations.models import CourseOrg, Teacher
# Create your views here.
class AddFavView(View):
    def post(self, request, *args, **kwargs):
        """
        用户收藏,取消收藏
        """
        #先判断用户是否登录
        if not request.user.is_authenticated:
            return JsonResponse({
                "status":"fail",
                "msg":"用户未登录"
            })

        user_fav_form = UserFavForm(request.POST)
        if user_fav_form.is_valid():
            fav_id = user_fav_form.cleaned_data["fav_id"]
            fav_type = user_fav_form.cleaned_data["fav_type"]

            #是否已经收藏
            existed_records = UserFavorite.objects.filter(user=request.user, fav_id=fav_id, fav_type=fav_type)
            if existed_records:
                existed_records.delete()

                if fav_type == 1:
                    course = Course.objects.get(id=fav_id)
                    course.fav_nums -= 1
                    course.save()
                elif fav_type == 2:
                    course_org = CourseOrg.objects.get(id=fav_id)
                    course_org.fav_nums -= 1
                    course_org.save()
                elif fav_type == 3:
                    teacher = Teacher.objects.get(id=fav_id)
                    teacher.fav_nums -= 1
                    teacher.save()

                return JsonResponse({
                    "status": "success",
                    "msg": "收藏"
                })
            else:
                user_fav = UserFavorite()
                user_fav.fav_id = fav_id
                user_fav.fav_type = fav_type
                user_fav.user = request.user
                user_fav.save()

                return JsonResponse({
                    "status": "success",
                    "msg": "已收藏"
                })
        else:
            return JsonResponse({
                "status": "fail",
                "msg": "参数错误"
            })

相关课程推荐(单标签版)

# 通过课程的tag做课程的推荐
tag = course.tag
related_courses = []
if tag:
    related_courses = Course.objects.filter(tag=tag).exclude(id__in=[course.id])[:3]

前台


<div class="group_recommend">
{% for course in related_courses %}
<dl>
    <dt>
        <a target="_blank" href="">
            <img width="240" height="220" class="scrollLoading" src="{{ course.image.url }}"/>
        </a>
    </dt>
    <dd>
        <a target="_blank" href=""><h2> {{ course.name }}</h2></a>
        <span class="fl">学习时长:<i class="key">{{ course.learn_times }}</i></span>
    </dd>
</dl>
{% endfor %}
</div>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352