【开发企业官网】8.文章管理模块实现
本节我们将介绍企业官网中的重点部分,即新闻管理。在新闻管理中,我们提到新闻可以包含图片,但图片是非必需的。除了图片,新闻还包括标题、日期和内容。此外,我们还将成功案例纳入新闻管理范畴。成功案例有多种分类,当我们选择不同分类时,将显示不同内容。如下图所示:
我们将成功案例视为新闻管理的一部分,因为点击时我们希望它们链接到新闻页面。接下来,我们将介绍分类管理。由于分类具有分类ID,因此我们需要创建一个分类表。该表非常简单,只包含分类名称和ID两个字段。然后,我们创建新闻表。新闻表包括图片、标题、日期、内容和分类ID等字段。新闻表中的分类ID与分类表中的ID对应,实现了一对多的关系,即一个分类对应多个新闻,这是一对多的关系。
现在,我们将开始创建模型。首先,我们需要进入news文件夹中的models.py文件中,因为有两张表我们创建两个类:一个是Category(分类),另一个是News(新闻)。首先是Category类,它包含一个自增的主键ID和一个最大长度为20的分类名称字段。接着是News类,它也有一个自增的主键ID,标题字段限制最大长度为100,内容字段使用Text类型以支持较长的内容,封面字段是图片类型,上传至news文件夹下。封面字段是可选的,因此我们使用了blank=True。此外,新闻还包括发布时间(created_at)和更新时间(updated_at),它们使用datetime字段,创建时间使用auto_now_add设置为True,允许编辑(editable=True),更新时间也是类似的设置。分类和新闻是一对多的关系,因此我们在新闻表中使用外键关联到分类表。代码如下:
from django.db import models
from ckeditor.fields import RichTextField
from ckeditor_uploader.fields import RichTextUploadingField
# 分类模型
class Category(models.Model):
# 主键,自增
id = models.AutoField(primary_key=True)
# 分类名称
name = models.CharField('分类名称', max_length=20)
class Meta:
# 数据库表名
db_table = 'category'
# 在管理后台显示的名称
verbose_name = '分类管理'
# 在管理后台显示的名称
verbose_name_plural = '分类管理'
def __str__(self):
return self.name # 返回分类名称作为对象的字符串表示形式
# 新闻模型
class News(models.Model):
# 主键,自增
id = models.AutoField(primary_key=True)
# 标题
title = models.CharField('标题', max_length=100)
# 内容,使用富文本上传字段
content = RichTextUploadingField()
# 封面图片,上传至news文件夹下,可选字段
cover = models.ImageField('封面', upload_to='news', blank=True, null=True, help_text='最佳尺寸:480*270')
# 创建时间,自动获取当前时间,可编辑
created_at = models.DateTimeField('创建时间', auto_now_add=True, editable=True)
# 更新时间,自动获取当前时间,可编辑
updated_at = models.DateTimeField('更新时间', auto_now=True, editable=True)
# 分类,外键关联到Category模型,删除分类时级联删除相关新闻
category = models.ForeignKey(Category, on_delete=models.CASCADE)
class Meta:
# 数据库表名
db_table = 'news'
# 在管理后台显示的名称
verbose_name = '新闻管理'
# 在管理后台显示的复数形式名称
verbose_name_plural = '新闻管理'
def __str__(self):
return self.title # 返回新闻标题作为对象的字符串表示形式
创建模型后,我们执行迁移并启动服务。在vscode终端输入:
python manage.py makemigrations
python manage-py migrate
python manage.py runserver
在浏览器地址栏输入127.0.0.1:8000/admin/,在页面上还看不到新闻管理,因为我们尚未配置管理后台。如下图所示:
接着,我们配置管理后台,在news文件夹下admin.py中分别创建CategoryAdmin和NewsAdmin类,并将它们注册到管理后台。代码如下:
from django.contrib import admin
from news.models import Category, News # 导入模型类
# 分类模型的管理类
class CategoryAdmin(admin.ModelAdmin):
# 在管理后台中显示的字段
list_display = ('id', 'name')
# 新闻模型的管理类
class NewsAdmin(admin.ModelAdmin):
# 在管理后台中显示的字段
list_display = ('title', 'category', 'created_at')
# 将模型类和管理类注册到管理后台
admin.site.register(Category, CategoryAdmin)
admin.site.register(News, NewsAdmin)
最后,我们启动服务并刷新页面,可以看到已经新增了分类管理和新闻管理。如下图所示:
接下来,我们修改应用的verbose_name,使之更符合逻辑。在news文件夹下apps.py文件中来修改,添加代码如下:
from django.apps import AppConfig
# 定义News应用的配置类
class NewsConfig(AppConfig):
# 指定默认的自增字段类型
default_auto_field = 'django.db.models.BigAutoField'
# 应用的名称
name = 'news'
# 在管理后台中显示的应用名称
verbose_name = '新闻管理'
刷新页面,现在news就修改成了新闻管理了,如下图所示:
现在,我们可以添加分类和新闻了。我们先添加4个分类,如下图所示:
我们可以继续添加新闻,选择分类并填写标题、内容和封面等信息。如下图所示:
添加完成后,我们可以看到已经成功添加了新闻。