项目源码和数据库文件:链接
接上文:上文链接
资料来自图书《Django Web应用开发实战 黄永祥》
模型字段content只负责存储文章内容,它不会对文章内容进行排版布局,如果要编写排版整齐、布局精美的博客文章,就需要引入Django的第三方功能应用Django CKEditor生成文章编辑器。
# 安装Django CKEditor
pip install django-ckeditor
需要在配置文件中进行配置
# myblog的settings.py
INSTALLED_APPS = [
# 'django.contrib.admin',
'myblog.myapps.MyAdminConfig',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'article',
'album',
'account',
'interflow',
'ckeditor',
'ckeditor_uploader',
]
# 编辑器的配置信息
CKEDITOR_UPLOAD_PATH = "article_images"
CKEDITOR_CONFIGS = {
'default': {
'toolbar': 'Full'
}
}
CKEDITOR_ALLOW_NONIMAGE_FILES = False
CKEDITOR_BROWSE_SHOW_DIRS = True
下一步在项目中定义Django CKEditor的路由信息
# myblog的urls.py
from django.contrib import admin
from django.urls import path, include, re_path
from django.views.static import serve
from django.conf import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('user/', include('account.urls')),
path('', include('article.urls')),
path('album/', include('album.urls')),
path('board/', include('interflow.urls')),
re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}, name='media'),
re_path('static/(?P<path>.*)', serve, {'document_root': settings.STATIC_ROOT}, name='static'),
# 设置编辑器的路由信息
path('ckeditor/', include('ckeditor_uploader.urls')),
]
# article的models.py
from django.db import models
from django.utils import timezone
from account.models import MyUser
from ckeditor_uploader.fields import RichTextUploadingField
class ArticleTag(models.Model):
id = models.AutoField(primary_key=True)
tag = models.CharField('标签', max_length=500)
user = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='用户')
def __str__(self):
return self.tag
class Meta:
verbose_name = '博文分类'
verbose_name_plural = '博文分类'
class ArticleInfo(models.Model):
author = models.ForeignKey(MyUser, on_delete=models.CASCADE, verbose_name='用户')
title = models.CharField('标题', max_length=200)
content = RichTextUploadingField(verbose_name='内容')
articlephoto = models.ImageField('文章图片', blank=True, upload_to='images/article/')
reading = models.IntegerField('阅读量', default=0)
liking = models.IntegerField('点赞量', default=0)
created = models.DateTimeField('创建时间', default=timezone.now)
updated = models.DateTimeField('更新时间', auto_now=True)
article_tag = models.ManyToManyField(ArticleTag, blank=True, verbose_name='文章标签')
def __str__(self):
return self.title
class Meta:
verbose_name = '博文管理'
verbose_name_plural = '博文管理'
class Comment(models.Model):
article = models.ForeignKey(ArticleInfo, on_delete=models.CASCADE, verbose_name='所属文章')
commentator = models.CharField('评论用户', max_length=90)
content = models.TextField('评论内容')
created = models.DateTimeField('创建时间', auto_now_add=True)
def __str__(self):
return self.article.title
class Meta:
verbose_name = '评论管理'
verbose_name_plural = '评论管理'