27、获取评论数和细节处理
1、如何获取评论数
- 方法:
filter
筛选再用count方法计数 - 问题:页面和代码更加复杂了
修改blog/views.py如下:
修改blog_detail.html如下:
刷新页面,可以看到在博客详情页面就有显示评论数了
接着我们要让博客列表页面也显示出评论数
2、自定义模板标签
- 降低耦合,代码更加独立和使用更加简单
- 在app内创建templatetags包
- 创建py文件
- load标签加载该文件
在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如下;
先保存,刷新页面,可以看到这个自定义模板标签就可以把我们想要的东西返回输出到模板页面
另外,这个模板标签还可以传一些参数,示例如下:
comment_tags.py:
blog_detail.html:
那么这样的话,我们就可以不用这么复杂。views里面 评论数量统计 是通过参数blog_content_type和blog.pk获取,那事实上我们可以通过博客blog获取到blog_content_type和blog.pk,传入参数进去,就可以统计出评论数量
修改comment_tags.py如下:
然后注释掉views.py里面我们最开始写的 统计评论数 这一行代码
修改blog_detail.html如下:
刷新页面
这样的话,我们就不用改views,就可以通过自定义标签把评论数显示出来。
那么除了在博客详情页面,我们也可以在博客列表这个页面将评论数显示出来
修改blog_list.html如下:
刷新页面
另外,自定义模板标签还有其他用法, 可以查看django官方文档
回头看views,里面还包含了评论相关的东西,比如comments评论列表、comment_form评论表单,这两个用自定义模板标签实现,就不用把这部分内容加到views里面,就可以让评论app和博客app完全分离,让评论比较独立,而且自定义模板标签用起来也比较简单,符合我们所说的降低耦合性、代码更简单、使用起来更加方便。
我们一个个来看
先看comment_form,同样的,它也只需要blog_content_type和blog_pk,这个很好处理,我们只需要把博客这个参数传进去我们自定义的模板标签,然后返回一个form给前端模板页面 就可以了,
修改comment_tags.py如下(参考views中context[‘commment_form’]这一行):
然后找到对应的模板页面,修改blog_detail.html如下:
注释掉views中context[‘commment_form’]这一行
然后刷新页面
另外,我们再来做第三个改动:context[‘comments’]这里
同样的
修改comment_tags.py:
修改blog_detail.html如下:
注释掉views.py中对应的代码
刷新页面,之前评论相关的效果都存在,说明没有问题
3、细节处理
- 1、ajax返回的日期
- 返回的时间 --> 时间戳timestamp。指距离格林威治时间1970年01月01日00时00分00秒的秒数
- 2、CSS样式调整
- 3、级联删除:
DO_NOTHING
-->CASCADE
级联删除,保证数据完整性
- 4、
django-ckeditor
1、ajax返回的日期
我们评论一条,日期少了8小时,但我们刷新页面之后,这个时间恢复正常
这里,我们在处理表单的时候,在comment/views.py中,这里返回的评论日期时间,我们直接格式化了,格式化会去掉时区的信息。这里需要用到时间戳
然后我们在blog_detail.html定义一个方法,用来转换时间戳
刷新页面
2、CSS样式调整
修改blog_detail.html如下:
修改blog.css如下:
刷新页面
3、级联删除
我们先增加comment/admin.py里面显示的字段:
刷新后台页面,没有root的,说明是顶级评论。
这里我们尝试删除其中一条顶级评论,会发现报错。这是因为DO_NOTHING
有问题,我们查看官方文档(https://docs.djangoproject.com/en/2.0/ref/models/fields/),CASCADE
:级联删除,删除包含ForeignKey的对象。例如,我们在删除用户User的时候,它会把用户相关联的数据都给删除,而DO_NOTHING
就对应不到。
这里我们就需要把DO_NOTHING
全部替换成CASCADE
,使用sublime里面的全部替换方法进行替换
然后刷新页面,再删除,就能删除成功。删除评论之外,还会删除对应的回复
4、django-ckeditor
点击后台某篇博客的时候,出现错误:
修改settings.py如下:
刷新后台页面,显示正常