django+xadmin在線教育平臺(十七)
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
mark此時的all_course已經不是一個queryset,而是一個purepage對象。
對於頁碼進行修改
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
marktab_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 mark8-2&3完成課程詳情頁展示,課程詳情頁機構,相關推薦課程。收藏課程,收藏機構。
原文學習來自簡書,作者:天涯明月笙
鏈接:https://www.jianshu.com/p/9fb08147257c
django+xadmin在線教育平臺(十七)