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,
})

保留一个div

通过外键字段取外键表中字段
分页功能
拷贝代码:
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对象。

对于页码进行修改

直接把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,
用来判断激活状态。


修改a标签参数
# 热门课程推荐
hot_courses = Course.objects.all().order_by("-students")[:3]
return render
"hot_courses":hot_courses
修改html中

for循环填充内容

这里的degree我们在数据库中填写的是字母。如何显示为中文。
- 个人猜测: template if
get_degree_display degree是字段名。专门用于choice字段显示
本小节完成对应commit:
8-1完成课程列表页展示,分页,热门课程。
8-2 课程详情页1
拷贝course_detail进入template目录
可以看出这个页面也是继承base页面的。将course_list的页面框架拿过来
替换面包屑。

配置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。

有参数类型的把参数也传进来
进行数据填充:先取出当前的课程
# 此处的id为表默认为我们添加的值。
course = Course.objects.get(id = int(course_id))
return render(request, "course-detail.html", {
"course":course,
})
html中取出数据:

课程的章节数如何实现?
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]

链式调用取出数据
添加一些用户课程进行验证

可以看到已经大功告成
课程详情的view中添加clicknums+1
# 增加课程点击数
course.click_nums += 1
course.save()

8-3 课程详情页2

tab_cont1 中填充我们自己的内容。

教师数自定义函数
def get_teacher_nums:
return self.teacher_set.all().count
不用自定义函数的方法如下

课程是否相关
定义课程的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中使用;


8-2&3完成课程详情页展示,课程详情页机构,相关推荐课程。收藏课程,收藏机构。
原文学习来自简书,作者:天涯明月笙
链接:https://www.jianshu.com/p/9fb08147257c
django+xadmin在线教育平台(十七)的更多相关文章
- django+xadmin在线教育平台(一)
大家好,此教程为在慕学网的实战教程Python升级3.6 强力Django+杀手级Xadmin打造在线教育平台的学习笔记,不对望指正! 使用Django+Xadmin打造在线教育平台(Python2, ...
- django+xadmin在线教育平台(五)
3-3 django orm介绍与model设计 上节教程完成后代码(来学习本节前置条件): 对应commit: 留言板前端页面展示.本次内容截止教程3-2结束. 可能现在你还在通过手写sql语句来操 ...
- django+xadmin在线教育平台(四)
3-2 配置表单页面 必要的该说的,该了解的 前置条件: 你已经学习了前面教程.将项目的文件夹目录结构,setting配置等修改完毕与我保持一致. 本节通过Django快速的配置一个留言板页面来学习 ...
- django+xadmin在线教育平台(十)
剩余app model注册 courses注册 新建courses/adminx.py: # encoding: utf-8 __author__ = 'mtianyan' __date__ = '2 ...
- django+xadmin在线教育平台(六)
4-1 使用py3.6和django1.11开发系统前注意事项 直接通过Python3.6和django最新版本来开发我们的系统的一些注意事项. 原版本: Python 2.7 & djang ...
- django+xadmin在线教育平台(十六)
7-7 modelform 提交我要学习咨询1 对应表userask form会对字段先做验证,然后保存到数据库中. 可以看到我们的forms和我们的model中有很多内容是一样的.我们如何让代码重复 ...
- django+xadmin在线教育平台(十五)
7-4 课程机构列表页数据展示2 前去html中进行数据填充 mark 可以看到所有城市是通过a标签,当前选中城市为active. mark 之后把下面的写死的城市删除掉. mark 这时 ...
- django+xadmin在线教育平台(十四)
7-1 django templates模板继承1 机构可以筛选类别 机构可以根据所在地区进行分类 右侧我要学习功能: form表单提交 右下:授课机构排名 页面头部与底部为全局头和全局底部. Dja ...
- django+xadmin在线教育平台(十一)
6-1 首页和登录页面的配置 用户访问我们的根目录,我们需要把html文件返回给用户.因此我们第一步把html文件放入template目录. mark 在html中找到首页的html.拷贝到我们的 ...
随机推荐
- 前端路由vue-router介绍
一.前端路由vue-router介绍 Vue-Router 是 Vue.js 官方的路由管理器.它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌.包含的功能有: 嵌套的路由/视图表 模 ...
- JDBC实现动态查询
一 概述 1.什么是动态查询? 从多个查询条件中随机选择若干个组合成一个DQL语句进行查询,这一过程叫做动态查询. 2.动态查询的难点 可供选择的查询条件多,组合情况多,难以一一列举. 3.最终查询语 ...
- select @@identity用法
用select @@identity得到上一次插入记录时自动产生的ID 如果你使用存储过程的话,将非常简单,代码如下:SET @NewID=@@IDENTITY 说明: 在一条 INSERT.SELE ...
- Centos6安装oracle10g
刚刚开始学OCP.第一关,安装,被折腾得稀碎...查询了大量资料,多次失败后终于总结出一些经验,简单整理如下.[2014-12-11 重新整理了一下顺序,修改了脚本!] 需要注意的是:如果想尝试我提供 ...
- 从软件工程师的角度看MacBook Air的几个设计亮点
我多年从事软件开发和运营工作,从未跟“设计”间断过.现在在设计一个全新saas产品:超级表格(www.domypp.com).最近买了台苹果最新款的笔记本电脑MacBook Air,从该产品功能设计和 ...
- 《ArcGIS Runtime SDK for Android开发笔记》——(10)、ArcGIS Runtime SDK支持的空间数据类型
1.前言 移动端的数据来源非常重要,它决定了移动端功能的实现.早期的ArcGIS Android API中,主要以接入在线的数据源为主,因此主要实现在线的地图浏览.查询和路径分析.地理处理等从操作:在 ...
- UESTC 574 High-level ancients
分析: 无论父节点增加了多少,子节点的增量总比父节点多1. 这种差分的关系是保存不变的,我们可以一遍dfs根据结点深度得到在根结点的每个点的系数. 估且把一开始的结点深度称做c0吧,对于子树的修改就只 ...
- UOJ 48 次最大公约数
次最大公约数 = gcd / 其中一个数质因数中最小的. gcd(42,12) = 6; div(42) = 2*3*7 div(12) = 2^2*3 sgcd(42,12) = 6 / ...
- Codeforces Round #361 (Div. 2) E. Mike and Geometry Problem 【逆元求组合数 && 离散化】
任意门:http://codeforces.com/contest/689/problem/E E. Mike and Geometry Problem time limit per test 3 s ...
- AIM Tech Round 5 (rated, Div. 1 + Div. 2) C. Rectangles 【矩阵交集】
题目传传传送门:http://codeforces.com/contest/1028/problem/C C. Rectangles time limit per test 2 seconds mem ...