版权声明:攻城狮的博文 https://blog.csdn.net/weixin_40824913/article/details/85012837
业务逻辑开发
—————— 学习周报 2018.12.9
一 、本周计划:
- 完成第7章—— 课程机构功能实现(7-9------- 7-12)
- 完成第8章——课程功能实现(8-1)
二 、完成情况:
- 1.机构详情展示
- 2.课程机构收藏 或者 用户取消收藏功能
- 3.课程列表
- 功能1:课程排序
- 功能2:课程自动分页
- 功能3: 热门课程推荐
- 功能4:课程搜索功能
三、 展示:
错误1:利用xadmin后台管理系统增加教师时,点击“教师” _报错
原因:因为在organiztion/adminx中,这个地方多了一个空格,导致与model中定义的对应不上,(所以写代码时要认真!!!)
1、机构详情展示
- 后台数据库增加讲师,增加课程(加外键)
- 4个HTML文件导入template,重写HTML文件
- 编写organization/urls.py和organization/views.py
# organization/urls.py的部分代码
from django.conf.urls import url, include
from .views import OrgView, AddUserAskView, OrgHomeView, OrgCourseView
urlpatterns = [
# 课程机构列表页
url(r'^list/$', OrgView.as_view(), name="org_list"),
url(r'^add_ask/$', AddUserAskView.as_view(), name="add_ask"),
url(r'^home/(?P<org_id>\d+)/$', OrgHomeView.as_view(), name="org_home"),
url(r'^course/(?P<org_id>\d+)/$', OrgCourseView.as_view(), name="org_course"),
url(r'^desc/(?P<org_id>\d+)/$', OrgDescView.as_view(), name="org_desc"),
url(r'^org_teacher/(?P<org_id>\d+)/$', OrgTeacherView.as_view(), name="org_teacher"),
]
# organization/views.py的部分代码
class OrgHomeView(View):
"""
机构首页
"""
def get(self, request, org_id):
course_org = CourseOrg.objects.get(id=int(org_id))
all_courses = course_org.course_set.all()[:3]
all_teachers = course_org.teacher_set.all()[:1]
return render(request, 'org-detail-homepage.html', {
'all_courses':all_courses,
'all_teachers': all_teachers,
'course_org':course_org,
})
class OrgDescView(View):
"""
机构介绍页
"""
def get(self, request, org_id):
current_page = "desc"
course_org = CourseOrg.objects.get(id=int(org_id))
has_fav = False
if request.user.is_authenticated():
if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
has_fav = True
return render(request, 'org-detail-desc.html', {
'course_org':course_org,
'current_page':current_page,
'has_fav':has_fav
})
class OrgTeacherView(View):
"""
机构教师页
"""
def get(self, request, org_id):
current_page = "teacher"
course_org = CourseOrg.objects.get(id=int(org_id))
has_fav = False
if request.user.is_authenticated():
if UserFavorite.objects.filter(user=request.user, fav_id=course_org.id, fav_type=2):
has_fav = True
all_teachers = course_org.teacher_set.all()
return render(request, 'org-detail-teachers.html', {
'all_teachers':all_teachers,
'course_org':course_org,
'current_page':current_page,
'has_fav':has_fav
})
class OrgCourseView(View):
"""
机构课程列表页
"""
def get(self, request, org_id):
course_org = CourseOrg.objects.get(id=int(org_id))
all_courses = course_org.course_set.all()
return render(request, 'org-detail-course.html', {
'all_courses':all_courses,
'course_org':course_org,
})
- 机构首页界面:
- 机构课程界面:
- 机构介绍界面:
- 机构讲师界面:
2.课程机构收藏 或者 用户取消收藏功能
- 编写organization/urls.py和organization/views.py
在view中方法要注意逻辑,先要判断是否登录,才允许进行收藏!!!!
# organization/urls.py的代码
# 机构收藏
url(r'^add_fav/$', AddFavView.as_view(), name="add_fav"),
# organization/views.py的代码
class AddFavView(View):
"""
用户收藏,用户取消收藏
"""
def post(self, request):
fav_id = request.POST.get('fav_id', 0)
fav_type = request.POST.get('fav_type', 0)
if not request.user.is_authenticated():
#判断用户登录状态
return HttpResponse('{"status":"fail", "msg":"用户未登录"}', content_type='application/json')
exist_records = UserFavorite.objects.filter(user=request.user, fav_id=int(fav_id), fav_type=int(fav_type))
if exist_records:
#如果记录已经存在, 则表示用户取消收藏
exist_records.delete()
if int(fav_type) == 1:
course = Course.objects.get(id=int(fav_id))
course.fav_nums -= 1
if course.fav_nums < 0:
course.fav_nums = 0
course.save()
elif int(fav_type) == 2:
course_org = CourseOrg.objects.get(id=int(fav_id))
course_org.fav_nums -= 1
if course_org.fav_nums < 0:
course_org.fav_nums = 0
course_org.save()
elif int(fav_type) == 3:
teacher = Teacher.objects.get(id=int(fav_id))
teacher.fav_nums -= 1
if teacher.fav_nums < 0:
teacher.fav_nums = 0
teacher.save()
return HttpResponse('{"status":"success", "msg":"收藏"}', content_type='application/json')
else:
user_fav = UserFavorite()
if int(fav_id) > 0 and int(fav_type) > 0:
user_fav.user = request.user
user_fav.fav_id = int(fav_id)
user_fav.fav_type = int(fav_type)
user_fav.save()
if int(fav_type) == 1:
course = Course.objects.get(id=int(fav_id))
course.fav_nums += 1
course.save()
elif int(fav_type) == 2:
course_org = CourseOrg.objects.get(id=int(fav_id))
course_org.fav_nums += 1
course_org.save()
elif int(fav_type) == 3:
teacher = Teacher.objects.get(id=int(fav_id))
teacher.fav_nums += 1
teacher.save()
return HttpResponse('{"status":"success", "msg":"已收藏"}', content_type='application/json')
else:
return HttpResponse('{"status":"fail", "msg":"收藏出错"}', content_type='application/json')
-
点击收藏,再点击取消收藏:
再检查数据库:——(记录已经存在!!!!)
-
更改页面顶部,只要登录,每一个页面都显示登录,(静态页面变为动态页面):
<div class="top">
<div class="wp">
<div class="fl"><p>服务电话:<b>18889874563</b></p></div>
<!--登录后跳转-->
{% if request.user.is_authenticated %}
<div class="personal">
<dl class="user fr">
<dd>{{ user.username }}<img class="down fr" src="/static/images/top_down.png"/></dd>
<dt><img width="20" height="20" src="/static/media/image/2016/12/default_big_14.png"/></dt>
</dl>
<div class="userdetail">
<dl>
<dt><img width="80" height="80" src="/static/media/image/2016/12/default_big_14.png"/></dt>
<dd>
<h2>{{ request.user.nick_name }}</h2>
<p>{{ request.user.username }}</p>
</dd>
</dl>
<div class="btn">
<a class="personcenter fl" href="usercenter-info.html">进入个人中心</a>
<a class="fr" href="/logout/">退出</a>
</div>
</div>
</div>
{% else %}
<a style="color:white" class="fr registerbtn" href="{% url 'register' %}">注册</a>
<a style="color:white" class="fr loginbtn" href="{% url 'login' %}">登录</a>
{% endif %}
</div>
</div>
3.课程列表
- 导入course_list.html,更改;设置course的urls.py和views.py
- 访问页面“公开课”后,没有动态数据,所以在后台xadmin中添加数据:
- 功能1:实现自动分页:
from pure_pagination import Paginator, EmptyPage, PageNotAnInteger
# 对课程进行分页
try:
page = request.GET.get('page', 1)
except PageNotAnInteger:
page = 1
p = Paginator(all_courses, 3, request=request) # 3个课程一个页面
courses = p.page(page)
(12个课程,3个一页,自动分为4页)
- 功能2: 实现排序——默认排序按最新的排序
# 课程排序
sort = request.GET.get('sort', "")
if sort:
if sort == "students":
all_courses = all_courses.order_by("-students")
elif sort == "hot":
all_courses = all_courses.order_by("-click_nums")
- 功能3: 最热门课程推荐——根据点击数决定
- course_list.html的代码:
<div class="right layout">
<div class="head">热门课程推荐</div>
<div class="group_recommend">
{% for hot_course in hot_courses %}
<dl>
<dt>
<a target="_blank" href="{{ ecmall_ad.url }}">
<img width="240" height="220" class="scrollLoading" src="{{ MEDIA_URL }}{{ hot_course.image }}"/>
</a>
</dt>
<dd>
<a target="_blank" href="{{ ecmall_ad.url }}"><h2> {{ hot_course.name }}</h2></a>
<span class="fl">难度:<i class="key">{{ hot_course.get_degree_display }}</i></span>
</dd>
</dl>
{% endfor %}
</div>
</div>
- views.py的class CourseListView(View)代码:
hot_courses = Course.objects.all().order_by("-click_nums")[:3]
- 功能4:课程搜索功能
# 课程搜索
search_keywords = request.GET.get('keywords', "")
if search_keywords:
all_courses = all_courses.filter(
Q(name__icontains=search_keywords) | Q(desc__icontains=search_keywords) | Q(
detail__icontains=search_keywords))
下周任务:
- 完成第8章——课程功能实现(8-2 ~ 8-8)
- 1.课程详情页
- 2.课程章节信息
- 3.课程评论功能
- 4.相关课程推荐
- 5.视频播放页面
- 完成第9章——课程讲师功能实现(9-1 ~ 9-3)
- .讲师列表页
- 讲师详情页