1. 程式人生 > >django+xadmin在線教育平臺(十七)

django+xadmin在線教育平臺(十七)

在線 __date__ 書寫 favor 自己 agen cli 相同 ted

8-1 課程列表

拷貝課程列表頁到template目錄

創建課程相關的urls.py

Mxonline2/urls.py中聲明包含到course的url中:

    # 課程app的url配置
    url(r"^course/", include(‘courses.urls‘, namespace="course")),

django2.0.1版本:

    # 課程app的url配置
    path("course/", include(‘courses.urls‘, namespace="course")),

書寫處理列表展示相關的view

courses/views.py

class CourseListView(View):
    def get(self, request):
        return render(request, "course-list.html", { })

courses/urls.py

# encoding: utf-8
from courses.views import CourseListView

__author__ = ‘mtianyan‘
__date__ = ‘2018/1/13 0013 00:39‘

from django.conf.urls import url

urlpatterns = [
    # 課程列表url
    url(r‘^list/$‘, CourseListView.as_view(), name="list"),

]

django2.0.1版本:

# encoding: utf-8
__author__ = ‘mtianyan‘
__date__ = ‘2018/1/13 0013 01:57‘

# encoding: utf-8
from courses.views import CourseListView
from django.urls import path
app_name = "courses"
urlpatterns = [
    # 課程列表url
    path(‘list/‘, CourseListView.as_view(), name="list"),

]

此時訪問沒有樣式。我們開始對於course list html進行工作
可以觀察到它和orglist一樣可以有共同的頭尾。所以繼承base頁面

xadmin中添加一些課程。

然後在view中返回課程數據

class CourseListView(View):
    def get(self, request):
        all_course = Course.objects.all()
        return render(request, "course-list.html", {
            "all_course":all_course,
            
        })
技術分享圖片 mark

保留一個div

技術分享圖片 mark

通過外鍵字段取外鍵表中字段

分頁功能

拷貝代碼:

from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
 # 對課程機構進行分頁
        # 嘗試獲取前臺get請求傳遞過來的page參數
        # 如果是不合法的配置參數默認返回第一頁
        try:
            page = request.GET.get(‘page‘, 1)
        except PageNotAnInteger:
            page = 1
        # 這裏指從allorg中取五個出來,每頁顯示5個
        p = Paginator(all_orgs, 4, request=request)
        orgs = p.page(page)

改動完成:

class CourseListView(View):
    def get(self, request):
        all_course = Course.objects.all()
        # 對課程進行分頁
        # 嘗試獲取前臺get請求傳遞過來的page參數
        # 如果是不合法的配置參數默認返回第一頁
        try:
            page = request.GET.get(‘page‘, 1)
        except PageNotAnInteger:
            page = 1
        # 這裏指從allorg中取五個出來,每頁顯示5個
        p = Paginator(all_course,6 , request=request)
        courses = p.page(page)
        return render(request, "course-list.html", {
            "all_course":courses,

        })

在html中使用時註意object_list

此時的all_course已經不是一個queryset,而是一個purepage對象。

技術分享圖片 mark

對於頁碼進行修改

技術分享圖片 mark

直接把orglist中的那段拿過來就行了。自行替換變量名稱

此時已經好了。

排序功能

將之前的sort邏輯拷貝過來:

# 進行排序
        sort = request.GET.get(‘sort‘, "")
        if sort:
            if sort == "students":
                all_orgs = all_orgs.order_by("-students")
            elif sort == "courses":
                all_orgs = all_orgs.order_by("-course_nums")

修改完成:

        # 進行排序
        sort = request.GET.get(‘sort‘, "")
        if sort:
            if sort == "students":
                all_course = all_course.order_by("-students")
            elif sort == "hot":
                all_course = all_course.order_by("-click_nums")

應放在分頁之前。讓分頁處理所有篩選過的數據

return render時添加

            "sort":sort,

用來判斷激活狀態。

技術分享圖片 mark 技術分享圖片 mark

修改a標簽參數

    # 熱門課程推薦
        hot_courses = Course.objects.all().order_by("-students")[:3]
        return render
         "hot_courses":hot_courses

修改html中


技術分享圖片 mark

for循環填充內容

技術分享圖片 mark

這裏的degree我們在數據庫中填寫的是字母。如何顯示為中文。

  • 個人猜測: template if

get_degree_display degree是字段名。專門用於choice字段顯示

本小節完成對應commit:

8-1完成課程列表頁展示,分頁,熱門課程。

8-2 課程詳情頁1

拷貝course_detail進入template目錄

可以看出這個頁面也是繼承base頁面的。將course_list的頁面框架拿過來

替換面包屑。

技術分享圖片 mark

配置url訪問

django2.0.1:

    # 課程詳情頁
    re_path(‘course/(?P<course_id>\d+)/‘, CourseDetailView.as_view(), name="course_detail"),

書寫對應訪問的view

 課程詳情處理view

class CourseDetailView(View):
    def get(self, request, course_id):
        return  render(request, "course-detail.html", {

        })

嘗試訪問:

在列表展示頁放入詳情的url。

技術分享圖片 mark

有參數類型的把參數也傳進來

進行數據填充:先取出當前的課程

        # 此處的id為表默認為我們添加的值。
        course = Course.objects.get(id = int(course_id))

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

html中取出數據:

技術分享圖片 mark

課程的章節數如何實現?

models.py中自定義方法

    def get_zj_nums(self):
        # 獲取課程章節數的方法
        return self.lesson_set.all().count()

添加課程類別字段

    category = models.CharField(max_length=20, default=u"", verbose_name=u"課程類別")
makemigrations
migrate

operation中專門有張表是做用戶學習記錄的。

UserCourse查詢有哪些學生學習了這門課

    # 獲取學習這門課程的用戶
    def get_learn_users(self):
        # 誰的裏面添加了它做外鍵,他都可以取出來
        return self.usercourse_set.all()[:5]
技術分享圖片 mark

鏈式調用取出數據

添加一些用戶課程進行驗證

技術分享圖片 mark

可以看到已經大功告成

課程詳情的view中添加clicknums+1

        # 增加課程點擊數
        course.click_nums += 1
        course.save()
技術分享圖片 mark

8-3 課程詳情頁2

技術分享圖片 mark

tab_cont1 中填充我們自己的內容。

技術分享圖片 mark

教師數自定義函數

def get_teacher_nums:
    return self.teacher_set.all().count

不用自定義函數的方法如下

技術分享圖片 mark

課程是否相關

定義課程的tag ,如果tag相同,那麽是相關課程。

courses/models.py:

    tag = models.CharField(max_length=15, verbose_name=u"課程標簽", default=u"")

更改數據庫後必然。此處略。

 tag = course.tag
        if tag:
        # 需要從1開始不然會推薦自己
            relate_courses = Course.objects.filter(tag=tag)[1:2]
        else:
            relate_courses = []

return render加上:

            "relate_courses":relate_courses,

收藏功能:

將block js寫到頁面底部。

<script type="text/javascript">
//收藏分享
function add_fav(current_elem, fav_id, fav_type){
    $.ajax({
        cache: false,
        type: "POST",
        url:"{% url "org:add_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="/login/";
                }else{
                    alert(data.msg)
                }

            }else if(data.status == ‘success‘){
                current_elem.text(data.msg)
            }
        },
    });
}

$(‘#jsLeftBtn‘).on(‘click‘, function(){
    add_fav($(this), {{ course.id }}, 1);
});

$(‘#jsRightBtn‘).on(‘click‘, function(){
    add_fav($(this), {{ course.course_org.id }}, 2);
});


</script>

刷新後又不見了的問題,從view中傳遞has_fav的參數。前臺進行判斷。

  # 是否收藏課程
        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

return render

            "has_fav_course":has_fav_course,
            "has_fav_org":has_fav_org,

html中使用;

技術分享圖片 mark 技術分享圖片 mark

8-2&3完成課程詳情頁展示,課程詳情頁機構,相關推薦課程。收藏課程,收藏機構。



原文學習來自簡書,作者:天涯明月笙
鏈接:https://www.jianshu.com/p/9fb08147257c

django+xadmin在線教育平臺(十七)