天天看点

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

文章目录

  • 27、获取评论数和细节处理
    • 1、如何获取评论数
    • 2、自定义模板标签
    • 3、细节处理
      • 1、ajax返回的日期
      • 2、CSS样式调整
      • 3、级联删除
      • 4、django-ckeditor

27、获取评论数和细节处理

1、如何获取评论数

  • 方法:

    filter

    筛选再用count方法计数
  • 问题:页面和代码更加复杂了
    【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

修改blog/views.py如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

修改blog_detail.html如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新页面,可以看到在博客详情页面就有显示评论数了

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

接着我们要让博客列表页面也显示出评论数

2、自定义模板标签

  • 降低耦合,代码更加独立和使用更加简单
  • 在app内创建templatetags包
  • 创建py文件
  • load标签加载该文件
    【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

在comment文件夹下面新建一个文件夹templatetags,复制一个__init__.py文件到这个文件夹里,然后在这个目录下创建文件comment_tags.py,写入如下代码(小测试)

# # C:\Users\12482\Desktop\py_learn\Django2.0_chapter46\mysite_env\mysite\comment\templatetags\comment_tags.py
from django import template


register= template.Library()	# 用于注册

@register.simple_tag  # 将这个方法注册为simple_tag
def test():
	return 'this is test code'
           

保存后,重新启动服务之后,就把这个标签注册了,注册之后,我们就可以在模板页面使用。

首先要在模板页面中将这个标签加载进来(就像前面我们加载的那个静态文件一样,加载了之后就可以使用静态文件的标签)

修改blog_detail.html如下;

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

先保存,刷新页面,可以看到这个自定义模板标签就可以把我们想要的东西返回输出到模板页面

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

另外,这个模板标签还可以传一些参数,示例如下:

comment_tags.py:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

blog_detail.html:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

那么这样的话,我们就可以不用这么复杂。views里面 评论数量统计 是通过参数blog_content_type和blog.pk获取,那事实上我们可以通过博客blog获取到blog_content_type和blog.pk,传入参数进去,就可以统计出评论数量

修改comment_tags.py如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

然后注释掉views.py里面我们最开始写的 统计评论数 这一行代码

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

修改blog_detail.html如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新页面

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

这样的话,我们就不用改views,就可以通过自定义标签把评论数显示出来。

那么除了在博客详情页面,我们也可以在博客列表这个页面将评论数显示出来

修改blog_list.html如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新页面

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

另外,自定义模板标签还有其他用法, 可以查看django官方文档

回头看views,里面还包含了评论相关的东西,比如comments评论列表、comment_form评论表单,这两个用自定义模板标签实现,就不用把这部分内容加到views里面,就可以让评论app和博客app完全分离,让评论比较独立,而且自定义模板标签用起来也比较简单,符合我们所说的降低耦合性、代码更简单、使用起来更加方便。

我们一个个来看

先看comment_form,同样的,它也只需要blog_content_type和blog_pk,这个很好处理,我们只需要把博客这个参数传进去我们自定义的模板标签,然后返回一个form给前端模板页面 就可以了,

修改comment_tags.py如下(参考views中context[‘commment_form’]这一行):

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

然后找到对应的模板页面,修改blog_detail.html如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

注释掉views中context[‘commment_form’]这一行

然后刷新页面

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

另外,我们再来做第三个改动:context[‘comments’]这里

同样的

修改comment_tags.py:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

修改blog_detail.html如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

注释掉views.py中对应的代码

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新页面,之前评论相关的效果都存在,说明没有问题

3、细节处理

  • 1、ajax返回的日期
    • 返回的时间 --> 时间戳timestamp。指距离格林威治时间1970年01月01日00时00分00秒的秒数
  • 2、CSS样式调整
  • 3、级联删除:
    • DO_NOTHING

      -->

      CASCADE

      级联删除,保证数据完整性
  • 4、

    django-ckeditor

    【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

1、ajax返回的日期

我们评论一条,日期少了8小时,但我们刷新页面之后,这个时间恢复正常

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

这里,我们在处理表单的时候,在comment/views.py中,这里返回的评论日期时间,我们直接格式化了,格式化会去掉时区的信息。这里需要用到时间戳

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

然后我们在blog_detail.html定义一个方法,用来转换时间戳

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新页面

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

2、CSS样式调整

修改blog_detail.html如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

修改blog.css如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新页面

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

3、级联删除

我们先增加comment/admin.py里面显示的字段:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新后台页面,没有root的,说明是顶级评论。

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

这里我们尝试删除其中一条顶级评论,会发现报错。这是因为

DO_NOTHING

有问题,我们查看官方文档(https://docs.djangoproject.com/en/2.0/ref/models/fields/),

CASCADE

:级联删除,删除包含ForeignKey的对象。例如,我们在删除用户User的时候,它会把用户相关联的数据都给删除,而

DO_NOTHING

就对应不到。

这里我们就需要把

DO_NOTHING

全部替换成

CASCADE

,使用sublime里面的全部替换方法进行替换

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理
【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

然后刷新页面,再删除,就能删除成功。删除评论之外,还会删除对应的回复

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

4、django-ckeditor

点击后台某篇博客的时候,出现错误:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

修改settings.py如下:

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理

刷新后台页面,显示正常

【Django2.0学习笔记】27.获取评论数和细节处理27、获取评论数和细节处理