在django模型中,如果将商品详情字段类型设置为TextFiled(),当将该模型加入到后台管理的时候,只会呈现出普通的文本框。但是,我们实际工作中,编辑商品详情需要进行格式的编辑、上传图片、排版、修改文字颜色,这些普通的TextField都是不能实现的。
怎么解决?使用富文本编辑器
富文本编辑器有很多种类,我们项目中采用ckeditor
文档地址:https://pypi.org/project/django-ckeditor/
文档中非常详细,具体参考文档,以下是简单入门步骤:
pip install django-ckeditor
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'sp_user.apps.SpUserConfig', # 用户模块
'sp_goods.apps.SpGoodsConfig', # 商品模块
'ckeditor', # 添加ckeditor富文本编辑器
]
看文档:https://docs.djangoproject.com/en/dev/howto/static-files/
删除之前配置的STATICFILES_DIRS(本来上线就要删除),修改为STATIC_ROOT
#STATICFILES_DIRS = [
# os.path.join(BASE_DIR, "static"),
#]
# 设置静态文件根目录 上线的时候使用
STATIC_ROOT = os.path.join(BASE_DIR, "static")
使用以下命令,将django中安装在INSTALLED_APPS的其他应用所有的静态文件收集到STATIC_ROOT指定目录下
python.exe manage.py collectstatic
这个时候 我们在 static 目录下就能看的 ckeditor 目录,里面就是ckeditor使用到的所有的静态文件(css,js,image)。
这个时候又将之前的修改改回去,现在还没有上线,还得用之前的配置。
STATICFILES_DIRS = [
os.path.join(BASE_DIR, "static"),
]
# 设置静态文件根目录 上线的时候使用
# STATIC_ROOT = os.path.join(BASE_DIR, "static")
这个目录是相对目录,相对与 MEDIA_ROOT
CKEDITOR_UPLOAD_PATH = "uploads/"
将ckeditor_uploader添加到您的INSTALLED_APPS设置中。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'sp_user.apps.SpUserConfig', # 用户模块
'sp_goods.apps.SpGoodsConfig', # 商品模块
'ckeditor', # 添加ckeditor富文本编辑器
'ckeditor_uploader', # 添加ckeditor富文本编辑器文件上传部件
]
ckeditor上传文件内部机制使用 ajax 异步上传文件,需要配置上传访问地址才能被访问到。
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 上传部件自动调用的上传地址
url(r'^ckeditor/', include("ckeditor_uploader.urls")),
# 用户模块
url(r'^user/', include("sp_user.urls", namespace="sp_user")),
# 其他模块
]
ckeditor上传文件使用pillow
使用默认配置就行,具体看文档修改
# 编辑器样式配置
CKEDITOR_CONFIGS = {
'default': {
'toolbar': 'full',
},
}
# 导入ckeditor上富文本编辑器自带字段
from ckeditor_uploader.fields import RichTextUploadingField
class GoodsSPU(BaseModel):
"""
商品SPU表
"""
spu_name = models.CharField(verbose_name='商品SPU名称',
max_length=20,
)
# 使用ckeditor为我们提供的字段,不用重新迁移就可以
content = RichTextUploadingField(verbose_name="商品详情")
def __str__(self):
return self.spu_name
class Meta:
verbose_name = "商品SPU"
verbose_name_plural = verbose_name
{{content|safe}}