- 零基础使用Django2.0.1打造在线教育网站(二十四):全局
- 零基础使用Django2.0.1打造在线教育网站(六):教育网站
- 零基础使用Django2.0.1打造在线教育网站(三):Djan
- [实战分享]强力Django+杀手级xAdmin 打造上线标准的
- 零基础使用Django2.0.1打造在线教育网站(二十):课程相
- 零基础使用Django2.0.1打造在线教育网站(十三):邮箱验
- 零基础使用Django2.0.1打造在线教育网站(九):初识后台
- 零基础使用Django2.0.1打造在线教育网站(提示):错误贴
- 零基础使用Django2.0.1打造在线教育网站(一):项目介绍
- 零基础使用Django2.0.1打造在线教育网站(二):开发环境
写在前面
本篇笔记我们将介绍全局页面的配置,具体包括首页登出实现,点击数加1,收藏数配置,小喇叭消息已读配置,首页的开发以及404和500页面的配置等功能,下面我们依次介绍一下。
本篇笔记对应于第二十四篇代码,对应于github的位置是https://github.com/licheetools/eduline。
首页登出实现
现在我们来完善我们首页的系统登出功能,这个没有页码,你登出后只需要跳转到首页即可,所以我们只需要写一个view就能完成这个操作。
老规矩先配置path:打开eduline/urls.py文件,新增以下代码:
from users.views import LogoutView
# 登出url
path('logout/', LogoutView.as_view(), name="logout"),
然后打开users/view.py文件,在login的函数下面新增以下代码:
from django.urls import reverse
from django.contrib.auth import logout
from django.http import HttpResponseRedirect
# 用于实现用户首页登出的函数
class LogoutView(View):
def get(self, request):
# 采用Django自带的logout函数来完成我们登出的功能
logout(request)
# 不采用之前的render,而是采用重定向返回到首页
return HttpResponseRedirect(reverse("index"))
接下来在base.html页面进行跳转链接的配置:
![](https://img.haomeiwen.com/i8964398/5bf36e7468e14c1f.png)
别忘了还有其余2个base页面跳转的配置,很简单,这里就不介绍了。
点击数加1
1、为课程数加1:打开courses/view.py文件,找到CourseInfoView函数,新增以下代码:
course.students += 1
course.save()
就是这个样子:
![](https://img.haomeiwen.com/i8964398/c412e17103908022.png)
2、为讲师数加1:打开organization/view.py文件,找到TeacherDetailView函数,新增以下代码:
teacher.click_nums += 1
teacher.save()
就是这个样子:
![](https://img.haomeiwen.com/i8964398/ae343a373282953d.png)
3、为机构数加1:打开organization/view.py文件,找到OrgHomeView函数,新增以下代码:
course_org.click_nums += 1
course_org.save()
就是这个样子:
![](https://img.haomeiwen.com/i8964398/7a7af7f6a70f7583.png)
收藏数配置
其实收藏数我们在之前已经配置过了,但在这里重新提一下:在organization/views.py文件,我们找到AddFavView函数,就是这段代码:
# 用户收藏与取消收藏功能
class AddFavView(View):
def post(self, request):
# 取出fav_id,尽管是字符串类型,但是我们后面会进行整型转换,所以默认为0
fav_id = request.POST.get('fav_id', 0)
# 取到fav_type,尽管是字符串类型,但是我们后面会进行整型转换,所以默认为0
fav_type = request.POST.get('fav_type', 0)
# 未收藏时收藏和已收藏时取消收藏
# 判断用户是否登录,即使用户没有登录会有一个匿名的user
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
course.save()
if course.fav_nums <= 0:
course.fav_nums = 0
elif int(fav_type) == 2:
course_org = CourseOrg.objects.get(id=int(fav_id))
course_org.fav_nums -= 1
course_org.save()
if course_org.fav_nums <= 0:
course_org.fav_nums = 0
elif int(fav_type) == 3:
teacher = Teacher.objects.get(id=int(fav_id))
teacher.fav_nums -= 1
teacher.save()
if teacher.fav_nums <= 0:
teacher.fav_nums = 0
return HttpResponse('{"status":"success", "msg":"收藏"}', content_type='application/json')
else:
user_fav = UserFavorite()
# 过滤掉未取到fav_id type的默认情况
if int(fav_type) > 0 and int(fav_id) > 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')
下面那一大长段的if...elif...就是用于记录用户对课程,机构,讲师的收藏记录,自己再次好好体会一下。
接下来就是自己自行完善已经可以完成的url的跳转,由于太多,这里就不显示了,大家可以去我的github上查看详细的源代码,并进行对比!
小喇叭消息已读配置
前面我们只是在各个页面显示了未读消息,但是当我们读了这些信息以后,我们的未读消息是不是需要清空呢?接下来就是完善这个功能。打开users/views.py文件,新增以下代码:
# 用户进入个人中心之后,清空未读消息
all_unread_mesages = UserMessage.objects.filter(user=request.user.id,has_read=False)
for unread_mesages in all_unread_mesages:
unread_mesages.has_read = True
unread_mesages.save()
就是这个样子:
![](https://img.haomeiwen.com/i8964398/04b7f564e42159a5.png)
我们之前取了用户的所以消息,但是我们要的只是未读消息,所以需要配置一下:
打开users/model.py文件,代码修改为:
def get_unread_nums(self):
# 获取用户的未读消息的数量
from operation.models import UserMessage
return UserMessage.objects.filter(user=self.id, has_read=False).count()
就是这个样子:
![](https://img.haomeiwen.com/i8964398/e33d06726fc9405e.png)
首页的开发
打开users/urls.py文件,修改首页path:
from users.views import IndexView
# 首页url
path('', IndexView.as_view(), name="index"),
然后打开users/views.py文件,新定义一个函数:
from .models import Banner
# 慕海学习网首页函数
class IndexView(View):
def get(self, request):
# 取出录播图只显示5个,并按照顺序排列
all_banners = Banner.objects.all().order_by("index")[:5]
# 取出轮播课程,但是只显示3个
banner_courses = Course.objects.filter(is_banner=True)[:3]
# 取出非轮播课程,但是只显示6个
courses = Course.objects.filter(is_banner=False)[:6]
# 取出课程机构,但是只显示15个
course_orgs = CourseOrg.objects.all()[:15]
return render(request, "index.html", {
"all_banners": all_banners,
"banner_courses": banner_courses,
"courses": courses,
"course_orgs": course_orgs,
})
然后去你的xadmin添加5个轮播图,和修改轮播课程
接着就是去index.html页面配置数据的动态加载了:
![](https://img.haomeiwen.com/i8964398/1ad166efb56db4b2.png)
![](https://img.haomeiwen.com/i8964398/3d5de832d7f7df5a.png)
![](https://img.haomeiwen.com/i8964398/2f1f02b145cc8783.png)
注意:{{ forloop.counter|add:2 }}是为了从第三个开始计数的,这是Django自带的功能
![](https://img.haomeiwen.com/i8964398/60355de426cf92e5.png)
同样注意:{% if forloop.counter|divisibleby:5 %}five{% endif %}表示如果能被5整除则显示five,这也是Django自带的功能
打开users/views.py文件,修改登录页面,解决登录信息没有及时显示的问题。
![](https://img.haomeiwen.com/i8964398/f1c56fdc1578eff7.png)
404和500页面的配置
老规矩,从前端资料里面拷贝我们的404和500页面到templates文件夹并修改文件里面的静态文件地址。打开eduline/urls.py文件,新增代码如下:
# 全局404页面配置
handler404 = 'users.views.page_not_found'
就是这个样子:
![](https://img.haomeiwen.com/i8964398/6e7a929f8dc33672.png)
然后打开users/views.py文件,新增以下代码:
# 404页面对应的处理函数
def page_not_found(request):
from django.shortcuts import render_to_response
response = render_to_response("404.html", {
})
# 设置response的状态码
response.status_code = 404
return response
接着运行我们的项目,随意输入一个地址,发现页面并没有出来,那是因为在eduline/settings.py文件里面:DEBUG = True,所以我们需要修改它为False,还有下面的允许访问IP地址,否则404页面也是出不来的:
DEBUG = False
ALLOWED_HOSTS = ['*']
这样重新运行一下我们的项目,发现页面有了,但是样子却没加载出来,这是为什么呢?
因为DEBUG为True时,系统会自动前往STATICFILES_DIRS下寻找文件的。所以我们开始一般都会选择True,便于错误信息的显示。
但是一旦DEBUG为False时,情况就不一样了,Django就不会代管你的静态文件了,而事实上一般静态文件都是通过第三方http服务器来代理转发。(如常见的服务器Nignx 和 Apache都会自动代理这些静态文件)
为了解决上述问题,我们这样做:打开eduline/settings.py文件,新增代码如下:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
同时将里面的STATICFILES_DIRS给注释掉(这一步很重要,否则系统还是去找这个文件,事实上是找不到的,所以还是图片加载不出来):
# STATICFILES_DIRS = [
# os.path.join(BASE_DIR, "static"), # 说明静态文件放在哪个目录,记住这里只能用列表或者元组,单一一个元组需要用,结尾
# ]
打开eduline/urls.py文件,新增代码如下:
from eduline.settings import STATIC_ROOT
# 配置静态文件上传的访问处理url
re_path('static/(?P<path>.*)', serve, {"document_root": STATIC_ROOT}),
现在重新运行我们的项目,看看404是不是出来了。
500的页面的配置和这个一模一样(注意函数名为page_error),这里就不再赘述了。
至此,本篇关于全局页面配置的介绍就到此为止了,感谢你的赏阅。
本篇笔记对应于第二十四篇代码,对应于github的位置是https://github.com/licheetools/eduline。
网友评论