Django搭建个人博客:在博文中发表评论

准备工作

评论是一个相对独立的功能,因此新建一个评论的app:

(env) E:\django_project\my_blog > ppython manage.py startapp comment

有的人觉得奇怪,没有博文就没有评论,为什么说评论是“独立”的功能?

那是因为不仅博文可以评论,照片、视频甚至网站本身都可以“被评论”。将其封装成单独的模块方便以后的扩展。

确认app创建成功后,记得在settings.py中注册:

因为我们想显示发表评论的时间,修改时区设置TIME_ZONE为上海的时区。

然后在my_blog/urls.py中注册根路由:

编写核心功能

评论的模型

首先编写评论的模型:

模型中共有2个外键:

article是被评论的文章

user是评论的发布者

别忘了每次新增、修改Model后,必须数据迁移

提示:你必须先在setting.py中注册app,这个app中的数据迁移才能生效

评论的表单

用户提交评论时会用到表单,因此新建表单类:


因为模型中的2个外键将通过视图逻辑自动填写,所以这里只需要提交body就足够了。

评论的url

在comment app中新建路由文件:

评论必须关联在某篇具体的博文里,因此传入博文的id,方便后续调用。

post_comment()视图还没写,先取个名字占位置。

评论的视图

评论的视图函数如下:


代码中有2个新面孔。

get_object_or_404():它和Model.objects.get()的功能基本是相同的。区别是在生产环境下,如果用户请求一个不存在的对象时,Model.objects.get()会返回Error 500(服务器内部错误),而get_object_or_404()会返回Error 404。相比之下,返回404错误更加的准确。

redirect():返回到一个适当的url中:即用户发送评论后,重新定向到文章详情页面。当其参数是一个Model对象时,会自动调用这个Model对象的get_absolute_url()方法。因此接下来马上修改article的模型。

实际上之前的章节已经用过redirect()了。功能是相同的,实现上略有区别。

文章的模型

按照上面说的,在文章模型中添加get_absolute_url()方法:

通过reverse()方法返回文章详情页面的url,实现了路由重定向。

文章详情视图

评论模块需要在文章详情页面展示,所以必须把评论模块的上下文也传递到模板中。

因此修改article/views.py中的article_detail():


filter()可以取出多个满足条件的对象,而get()只能取出1个,注意区分使用

文章详情模板

到最后一步了,坚持。所有后台的功能已经写完了,就差把所有这些展现到页面中了。

修改文章详情页面:

表单组件中的action指定数据提交到哪个url中

显示评论中的comments.count是模板对象中内置的方法,对包含的元素进行计数

|date:"Y-m-d H:i:s":管道符你已经很熟悉了,用于给对象“粘贴”某些属性或功能。这里用于格式化日期的显示方式。请尝试修改其中的某些字符试试效果。

<pre>定义预格式化的文本,在我们的项目中最关键的作用是保留空格和换行符。该标签会改变文字的字体、大小等,因此用style属性重新定义相关内容。尝试将<pre>替换为div,输入多行文本试试效果。

之前说代码最好不要复制粘贴,否则有些“小坑”你是留意不到的。比如在<pre>标签中的文本千万不能缩进。

测试

又到了激动人心的测试环节了。

登录自己的账户,进入某个文章详情页面,发现已经可以进行留言了:


如果退出登录,显示提示语:

点击登录就回到登录页面。

评论模块的发布、展示功能就搞定了。

扫尾工作

数据的删、改功能我们已经做过很多遍,这里不打算再赘述了。

评论同样也可以支持Markdown语法,或者插入Emoji表情符号。

读者可以自己去实现感兴趣的功能。

有些网站干脆就没有删除、更新评论的功能。因为对小站来说,这些功能用到的次数太少太少了,不如把精力用在更有价值的地方去。比如我的博客就没有。

还有的网站提供软删除,删除后仅仅是不显示而已,实际上数据还存在。

具体应该如何做,都以你的喜好而定。

猜你喜欢

转载自blog.csdn.net/qq_40925239/article/details/88761046