Python打造在线教学平台——学习周报5

版权声明:攻城狮的博文 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)
    • .讲师列表页
    • 讲师详情页

猜你喜欢

转载自blog.csdn.net/weixin_40824913/article/details/85012837