哈喽,大家好呀,我是滑稽君。本期我们为博客加上分类统计功能、后台富文本编辑功能、和阅读计数功能。那么我们先说说富文本编辑器是什么。
富文本编辑器,Rich Text Editor, 简称 RTE, 它提供类似于 Microsoft Word 的编辑功能,容易被不会编写 HTML 的用户并需要设置各种文本格式的用户所喜爱。它的应用也越来越广泛。
视频讲解:
我们的后台管理是这样的:
大家可以看到,我们编辑内容的部分出现了很多功能,仔细一看是不是很像word的编辑栏。那到这里想必大家都明白了。
下面是它呈现出来的效果。我们对部分内容加粗、斜体、换颜色、我们还上传了两张图片。我们的博客终于不那么单调了。
这里我们选择了django-ckeditor这样一个富文本编辑器。我们直接在虚拟环境中pip即可。为了使我们的博客能够上传图片还需要下载pillow库,这个我们在往期文章用到过,是一个图像处理库。
当你在虚拟环境下这是我的pip list,大家可以参考一下。一定要注意是在虚拟环境下pip。
阅读计数和分类统计:
可以看到文章28总浏览量为12,而右侧分类栏我们统计了各类包含的文章数量。
部分代码:
utils.py
def read_statistics_once_read(request, obj): ct = ContentType.objects.get_for_model(obj) key = "%s_%s_read" % (ct.model, obj.pk) if not request.COOKIES.get(key): # 每次访问会改变last_updated_time这个需要解决。 # 读过文章,返回cooki,下一次再访问,会返回cookie, # 那么没有捕捉到cookie就说明是新用户,我们+1,所有使用if not # 这就解决了每次刷新页面认识都增加的问题 if ReadNum.objects.filter(content_type=ct, object_id=obj.pk).count(): #存在记录 readnum = ReadNum.objects.get(content_type=ct, object_id=obj.pk) else: #不存在对应记录 readnum = ReadNum(content_type=ct, object_id=obj.pk) #计数加1 readnum.read_num += 1 readnum.save() return key
这部分代码处理文章阅读计数问题。我们使用cookie来记录用户的状态。其实这玩意跟我们也是老朋友了,在爬虫系列时,我们经常接触。
views.py
def blog_detail(request, blog_pk): blog = get_object_or_404(Blog, pk=blog_pk) read_cookie_key = read_statistics_once_read(request, blog) context = {} #filter后的内容,返回比当前时间大于的创建时间的最后一个。这样我们可以得到上一篇博客 context['previous_blog'] = Blog.objects.filter(created_time__gt=blog.created_time).last() context['next_blog'] = Blog.objects.filter(created_time__lt=blog.created_time).first() context['blog'] = blog response = render_to_response('blog/blog_detail.html', context) response.set_cookie(read_cookie_key, 'true',)#阅读cookie标记 #max_age=60 秒为单位, expires=datetime 都不设置时退出浏览器cookie就失效,后者存在时,前者失效。 #那么这种情况下,我们在只关闭页面,不关闭浏览器,人数不会增加,而关闭浏览器cookie失效,再打开页面,人数会增加 #看utils行的注释 return response
这段代码,我们需要注意的是11行的设置cookie的部分。注释解释的很详细了。
上面两段代码实现的功能是,当你第一次打开文章,没有捕捉到cookie信息,阅读加一。当你刷新或者是关闭当前页面重新点击时,阅读数不会增加。这是因为我们cookie的生命周期是直到你关闭浏览器。如果你关闭浏览器,重新点击文章,这时阅读数会再次加一。
models.py
from django.db import modelsfrom django.contrib.auth.models import Userfrom ckeditor_uploader.fields import RichTextUploadingFieldfrom read_statistics.models import ReadNumExpandMethodclass BlogType(models.Model): type_name = models.CharField(max_length=15) def __str__(self): return self.type_name# Create your models here.class Blog(models.Model, ReadNumExpandMethod): title = models.CharField(max_length=50) blog_type = models.ForeignKey(BlogType, on_delete=models.DO_NOTHING) content = RichTextUploadingField() author = models.ForeignKey(User, on_delete=models.DO_NOTHING) read_num = models.IntegerField(default=0) created_time = models.DateTimeField(auto_now_add=True) last_updated_time = models.DateTimeField(auto_now=True) def __str__(self): return "" %self.title class Meta: ordering = ['-created_time']
导入django-ckeditor库,16行换成RichTextUploadingField()。
把计数功能和blog放在一起,会导致访问时最近更新时间也被修改。因为每次访问,阅读量都发生了变化,这不是我们想看的的。因此我们新添加一个app来单独完成计数功能--read_statistics。
read_statistics\admin.py
from django.contrib import adminfrom .models import ReadNum@admin.register(ReadNum)class ReadNumAdmin(admin.ModelAdmin): list_display = ('read_num', 'content_object')
read_statistics\modes.py
from django.db import modelsfrom django.db.models.fields import exceptionsfrom django.contrib.contenttypes.fields import GenericForeignKeyfrom django.contrib.contenttypes.models import ContentTypeclass ReadNum(models.Model): read_num = models.IntegerField(default=0) content_type = models.ForeignKey(ContentType, on_delete=models.DO_NOTHING) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id')class ReadNumExpandMethod(): def get_read_num(self): #找到对应记录返回,找不到就返回0 try: ct = ContentType.objects.get_for_model(self) readnum = ReadNum.objects.get(content_type=ct, object_id=self.pk) return readnum.read_num except exceptions.ObjectDoesNotExist: return 0
read num:
在read num中查找访问记录,返回对应的数值,没有访问过的页面没有对应的记录,因此当查询不到时,我们返回0。这里使用了错误处理机制。
这样它和blog就互不影响了。
我们仅展示部分源码,更细节的内容我们放在视频中为大家演示,全部源码放百度云啦~
https://pan.baidu.com/s/1tUJ3x9l_Dq1EvmTtMT4GOQ公众号内发送django获取提取码。https://space.bilibili.com/252028233
❂ 滑稽研究所
朋友们,看视频啊,看视频。