富文本编辑_博客的后台富文本编辑和阅读计数

e7604926be2f0c341c7677403fe5a6fe.png 83cb4cbd0a6aff89926f9641612af876.gif

哈喽,大家好呀,我是滑稽君。本期我们为博客加上分类统计功能、后台富文本编辑功能、和阅读计数功能。那么我们先说说富文本编辑器是什么。

富文本编辑器,Rich Text Editor, 简称 RTE, 它提供类似于 Microsoft Word 的编辑功能,容易被不会编写 HTML 的用户并需要设置各种文本格式的用户所喜爱。它的应用也越来越广泛。

5bf0da17e647da56e00406f3c189bb37.gif

视频讲解:

我们的后台管理是这样的:

25bf958ad492fafcc65e8188c92eaefa.png

大家可以看到,我们编辑内容的部分出现了很多功能,仔细一看是不是很像word的编辑栏。那到这里想必大家都明白了。

下面是它呈现出来的效果。我们对部分内容加粗、斜体、换颜色、我们还上传了两张图片。我们的博客终于不那么单调了。

c87b64a2da6cefcfe9fa31fcfe1d4325.png

这里我们选择了django-ckeditor这样一个富文本编辑器。我们直接在虚拟环境中pip即可。为了使我们的博客能够上传图片还需要下载pillow库,这个我们在往期文章用到过,是一个图像处理库。

当你在虚拟环境下这是我的pip list,大家可以参考一下。一定要注意是在虚拟环境下pip。

99b57ea6709e03eaa4d853506146ca84.png

阅读计数和分类统计:

e67b2a2e054a4a73a32f32db8f37e009.png

可以看到文章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:

f26f3acbd3db0608fd9cc9c153e22795.png

在read num中查找访问记录,返回对应的数值,没有访问过的页面没有对应的记录,因此当查询不到时,我们返回0。这里使用了错误处理机制。

这样它和blog就互不影响了。

我们仅展示部分源码,更细节的内容我们放在视频中为大家演示,全部源码放百度云啦~

https://pan.baidu.com/s/1tUJ3x9l_Dq1EvmTtMT4GOQ公众号内发送django获取提取码。https://space.bilibili.com/252028233
15f35da46030e0eff043314f8e2c1415.gif ❂ 滑稽研究所

 朋友们,看视频啊,看视频。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值