Django打造自己的在線教育網(wǎng)站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

結(jié)構(gòu): content中有兩個(gè)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 %}

配置課程列表超鏈接至課程詳細(xì)

打開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">學(xué)習(xí)人數(shù):{{course.students}}</span>
    </div>
    <ul class="parameter">
        <li><span class="pram word3">時(shí)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;長:</span><span>{{ course.learn_times }}</span></li>
        <li><span class="pram word3">章&nbsp;節(jié)&nbsp;數(shù):</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">學(xué)習(xí)用戶:</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">開始學(xué)習(xí)</a></div>
    </div>
</div>

其中{{ course.lesson_nums }}章節(jié)數(shù)是通過Course類中的lesson_nums 方法動(dòng)態(tài)統(tǒng)計(jì)章節(jié)數(shù)字

課程收藏和機(jī)構(gòu)收藏展示實(shí)現(xiàn)


在course應(yīng)用中的views.py中更新如下代碼

from apps.operations.models import UserFavorite
# 獲取收藏狀態(tài)
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

用戶收藏點(diǎn)擊實(shí)現(xiàn)

打開course-detail.html添加ajax請(qǐng)求代碼

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

無論點(diǎn)擊左側(cè)收藏和右側(cè)收藏都是請(qǐng)op下面的fav
項(xiàng)目urls增加

# 用戶相關(guān)操作
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"]

            #是否已經(jīng)收藏
            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": "參數(shù)錯(cuò)誤"
            })

相關(guān)課程推薦(單標(biāo)簽版)

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

前臺(tái)


<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">學(xué)習(xí)時(shí)長:<i class="key">{{ course.learn_times }}</i></span>
    </dd>
</dl>
{% endfor %}
</div>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末拯辙,一起剝皮案震驚了整個(gè)濱河市李皇,隨后出現(xiàn)的幾起案子匆光,更是在濱河造成了極大的恐慌,老刑警劉巖酣衷,帶你破解...
    沈念sama閱讀 221,820評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件悍抑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡阐虚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門蚌卤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來实束,“玉大人贸宏,你說我怎么就攤上這事】暮椋” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诫龙,是天一觀的道長析显。 經(jīng)常有香客問我,道長签赃,這世上最難降的妖魔是什么谷异? 我笑而不...
    開封第一講書人閱讀 59,714評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮锦聊,結(jié)果婚禮上歹嘹,老公的妹妹穿的比我還像新娘。我一直安慰自己孔庭,他們只是感情好尺上,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,724評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著圆到,像睡著了一般怎抛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芽淡,一...
    開封第一講書人閱讀 52,328評(píng)論 1 310
  • 那天马绝,我揣著相機(jī)與錄音,去河邊找鬼挣菲。 笑死富稻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的白胀。 我是一名探鬼主播椭赋,決...
    沈念sama閱讀 40,897評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼或杠!你這毒婦竟也來了纹份?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤廷痘,失蹤者是張志新(化名)和其女友劉穎蔓涧,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笋额,經(jīng)...
    沈念sama閱讀 46,345評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡元暴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,431評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兄猩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茉盏。...
    茶點(diǎn)故事閱讀 40,561評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鉴未,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鸠姨,到底是詐尸還是另有隱情铜秆,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評(píng)論 5 350
  • 正文 年R本政府宣布讶迁,位于F島的核電站连茧,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏巍糯。R本人自食惡果不足惜啸驯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,928評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望祟峦。 院中可真熱鬧罚斗,春花似錦、人聲如沸宅楞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽厌衙。三九已至搓幌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迅箩,已是汗流浹背溉愁。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饲趋,地道東北人拐揭。 一個(gè)月前我還...
    沈念sama閱讀 48,983評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像奕塑,于是被迫代替她去往敵國和親堂污。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,573評(píng)論 2 359