第 14 篇:交流的桥梁“评论功能”——HelloDjango 系列教程

截止到目前为止我们的 django blog 文章展示部分,已经实现的“八九不离十”了。你以为本系列文章就要结束了吗?不能够!新的征程才刚刚开始,HelloDjango 系列文章刚刚过半,后面的文章你将接触更多博客系统的细节。向着一个小而全的博客系统前进、前进、前进,你定会收获颇多。

今天我们就来开启博客的评论功能,建起和读者的沟通桥梁。

创建评论应用

相对来说,评论是另外一个比较独立的功能。Django 提倡,如果功能相对比较独立的话,最好是创建一个应用,把相应的功能代码组织到这个应用里。我们的第一个应用叫 blog,它里面放了展示博客文章列表和详情等相关功能的代码。而这里我们再创建一个应用,名为 comments 这里面将存放和评论功能相关的代码。首先进入到项目根目录,然后输入如下命令创建一个新的应用:

> pipenv run python manage.py startapp comments

可以看到生成的 comments 应用目录结构和 blog 应用的目录是类似的(关于创建应用以及应用的目录结构在 "空空如也"的博客应用 中已经有过详细介绍)。

创建新的应用后一定要记得在 settings.py 里注册这个应用,django 才知道这是一个应用。

blogproject/settings.py ... INSTALLED_APPS = [ ... 'blog.apps.BlogConfig', # 注册 blog 应用 'comments.apps.CommentsConfig', # 注册 comments 应用 ]v ...

注意这里注册的是 CommentsConfig 类,在 博客从“裸奔”到“有皮肤” 中曾经讲过如何对应用做一些初始化配置,例如让 blog 应用在 django 的 admin 后台显示中文名字。这里也对评论应用做类似的配置:

comments/app.py from django.apps import AppConfig class CommentsConfig(AppConfig): name = 'comments' verbose_name = '评论' 设计评论的数据库模型

用户评论的数据必须被存储到数据库里,以便其他用户访问时 django 能从数据库取回这些数据然后展示给访问的用户,因此我们需要为评论设计数据库模型,这和设计文章、分类、标签的数据库模型是一样的,如果你忘了怎么做,再回顾一下 创建 Django 博客的数据库模型 中的做法。我们的评论模型设计如下(评论模型的代码写在 comments\models.py 里):

comments/models.py from django.db import models from django.utils import timezone class Comment(models.Model): name = models.CharField('名字', max_length=50) email = models.EmailField('邮箱') url = models.URLField('网址', blank=True) text = models.TextField('内容') created_time = models.DateTimeField('创建时间', default=timezone.now) post = models.ForeignKey('blog.Post', verbose_name='文章', on_delete=models.CASCADE) class Meta: verbose_name = '评论' verbose_name_plural = verbose_name def __str__(self): return '{}: {}'.format(self.name, self.text[:20])

评论会保存评论用户的 name(名字)、email(邮箱)、url(个人网站,可以为空),用户发表的内容将存放在 text 字段里,created_time 记录评论时间。最后,这个评论是关联到某篇文章(Post)的,由于一个评论只能属于一篇文章,一篇文章可以有多个评论,是一对多的关系,因此这里我们使用了 ForeignKey。关于 ForeignKey 我们前面已有介绍,这里不再赘述。

此外,在 博客从“裸奔”到“有皮肤” 中提过,所有模型的字段都接受一个 verbose_name 参数(大部分是第一个位置参数),django 在根据模型的定义自动生成表单时,会使用这个参数的值作为表单字段的 label,我们在后面定义的评论表单时会进一步看到其作用。

创建了数据库模型就要迁移数据库,迁移数据库的命令也在前面讲过。在项目根目录下分别运行下面两条命令:

> pipenv run python manage.py makemigrations > pipenv run python manage.py migrate 注册评论模型到 admin

既然已经创建了模型,我们就可以将它注册到 django admin 后台,方便管理员用户对评论进行管理,如何注册 admin 以及美化在 博客从“裸奔”到“有皮肤” 有过详细介绍,这里给出相关代码:

comments/admin.py from django.contrib import admin from .models import Comment class CommentAdmin(admin.ModelAdmin): list_display = ['name', 'email', 'url', 'post', 'created_time'] fields = ['name', 'email', 'url', 'text', 'post'] admin.site.register(Comment, CommentAdmin) 设计评论表单

这一节我们将学习一个全新的 django 知识:表单。那么什么是表单呢?基本的 HTML 知识告诉我们,在 HTML 文档中这样的代码表示一个表单:

<form action="" method="post"> <input type="text" /> <input type="password" /> <input type="submit" value="login" /> </form>

为什么需要表单呢?表单是用来收集并向服务器提交用户输入的数据的。考虑用户在我们博客网站上发表评论的过程。当用户想要发表评论时,他找到我们给他展示的一个评论表单(我们已经看到在文章详情页的底部就有一个评论表单,你将看到表单呈现给我们的样子),然后根据表单的要求填写相应的数据。之后用户点击评论按钮,这些数据就会发送给某个 URL。我们知道每一个 URL 对应着一个 django 的视图函数,于是 django 调用这个视图函数,我们在视图函数中写上处理用户通过表单提交上来的数据的代码,比如验证数据的合法性并且保存数据到数据库中,那么用户的评论就被 django 处理了。如果通过表单提交的数据存在错误,那么我们把错误信息返回给用户,并在前端重新渲染表单,要求用户根据错误信息修正表单中不符合格式的数据,再重新提交。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyypsp.html