截止到目前为止我们的 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 r