博客的数据库设计
类型-type: |
id int - 类型id |
name -类型名 |
showorder 排序,越大越靠前,0 |
is_delete -状态-默认为0,正常,1为删除 |
create_time - 创建时间 |
update_time - 更新时间 |
文章-article: type - 分类id 外键 |
首先先进行Django之虚拟环境-virtualenv配置
Django之虚拟环境-virtualenv配置_Zionnnnnnnn的博客-优快云博客
1.pycharm创建django项目
命令语句:
django-admin startproject djangoblog
项目目录: ---django-blog --- __init__.py ---settings.py ---urls.py ---wsgi.py ---templates ---manage.py |
2.项目中配置自己的settings.py,创建一个本地配置文件(djangoblog>>djangoblog>>创建local_settings.py)
(这样的好处是让页面汉化,大家也知道自己的英文水平了2333333,所以就要配置)
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/ShangHai'
在djangoblog>>djangoblog>>的settings.py引入配置
# 引入本地配置
try:
from .local_settings import *
except:
pass
安装gitee插件,注册码云账户,配置码云账户和密码
命令行的形式--------------------------------------------------------->
--在码云中创建仓库 -- django-blog
--git init 初始化本地仓库
--git add . 将当前文件夹下面的所有文件虚拟仓库中
--git commit -m '初始化博客项目' 提交到本地仓库
--git remote add origin XXX(是自己的码云的仓库链接) 本地仓库和远程仓库的连接
XXX通常表现为https://gitee.com/(自己的昵称)/(仓库名)django-blog.git
--git push -u origin master 将本地仓库的内容推向远程仓库
下载远程仓库内容
git init
git pull 远程仓库的地址
git pull
添加了.gitignore 需要将本地的提交缓存刷新一下,重新提交-这样就可以生效
git rm -r --cached .
1.修改数据库,使用mysql及安装pymysql
djangoblog>>djangoblog>>的local_settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dblog',
'USER':'root',
'PASSWORD':'', #密码自己设置
'HOST':'localhost',
'PORT':'3306',
}
}
在数据库界面化软件中创建数据库
djangoblog>>djangoblog>>__init__.py
(配置的时候要安装好库 pip install pymysql)
import pymysql
pymysql.install_as_MySQLdb()
2.创建两个应用,分别是ar_type、article
(要在djangoblog目录下创建)
python manage.py startapp ar_type
python manage.py startapp article
记住每创建一个应用后都要去相应的配置(补充)注册 djangoblog>>djangoblog>>settings.py:
INSTALLED_APPS = [
'ar_type',
'article',
]
在djangoblog目录下创建 templates目录
djangoblog>>djangoblog>>settings.py的TEMPLATES配置'DIRS'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR,'templates')], # 配置这一行
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
运行可能会出错(无错忽视即可),-- 创建引用,报错:
'DIRS': [BASE_DIR / 'templates']
TypeError: unsupported operand type(s) for /: 'str' and 'str'
注册应用后,因为每一张表中都有is_detele和create_time 和update_time因此设计一个共有基类
在项目文件夹djangoblog下创建db文件夹再创建__init__.py、baseModel.py,存放基类
--djangoblog
--db
--__init__.py
--baseModel.py
djangoblog>>db>>baseModel.py设置
from django.db import models
class BaseModel(models.Model):
"""模型基类"""
create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
is_delete = models.BooleanField(default=False,verbose_name='删除标记')
showorder = models.IntegerField(default=0,verbose_name='排列序号')
class Meta:
# 说明该类是抽象类
abstract = True
关于Meta这里不过多阐述,其作用是说明该类是抽象类
返回每一个应用(ar_type、article)的models中引入基类(djangoblog>>ar_type>>migrations>>models.py)
from django.db import models
from db.baseModel import BaseModel
# Create your models here.
class ArType(BaseModel):
name = models.CharField(max_length=10,verbose_name='类型名称')
class Meta:
db_table = "ar_type"
# 为了美观设置中文
verbose_name_plural = '类型'
(djangoblog>>article>>migrations>>models.py)
from django.db import models
from db.baseModel import BaseModel
from ar_type.models import ArType
# Create your models here.
class Article(BaseModel):
title = models.CharField(max_length=200,verbose_name='文章标题')
post_img = models.ImageField(upload_to='poster',verbose_name='封面图片')
author = models.CharField(max_length=20,verbose_name='作者姓名')
desc = models.TextField(verbose_name='文章简介')
content = models.TextField(verbose_name='文章内容')
view_num = models.IntegerField(default=0,verbose_name='浏览人数')
zan_num = models.IntegerField(default=0,verbose_name='点赞人数')
type = models.ForeignKey(ArType,verbose_name='文章类型')
class Meta:
db_table = "article"
verbose_name_plural = '文章'
好了这一步配置好了之后就可以进行数据库及迁移了
可能会报错:Cannot use ImageField because Pillow is not installed
解决:pip install Pillow(没有这个库安装一下就行)
1.后台用户及界面处理
创建一个超级用户root:python manage.py createsuperuser
启动服务:python manage.py runserver
打开http://127.0.0.1:8000/admin 输入用户名和密码进行登录
djangoblog>>ar_type>>admin.py 注册模板,在后台显示
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(ArType)
同理 djangoblog>>article>>admin.py 注册模板,在后台显示
from django.contrib import admin
from .models import *
# Register your models here.
admin.site.register(Article)
若要修改后台显示的表名,要在每个应用下的models.py中的class Meta中设置verbose_name_plural = 'xx'
修改列表显示的内容,djangoblog>>ar_type>>admin.py
from django.contrib import admin
from .models import *
# Register your models here.
class ArTypeAdmin(admin.ModelAdmin):
list_display = ['id','name','showorder','create_time']
# 分页每页10条
list_per_page = 10
list_display_links = ['name']
list_editable = ['showorder']
# 配置要注册ArTypeAdmin
admin.site.register(ArType,ArTypeAdmin)
djangoblog>>article>>admin.py
from django.contrib import admin
from .models import *
# Register your models here.
class ArticleAdmin(admin.ModelAdmin):
list_display = ['id','title','author','post_img','desc','view_num','zan_num','showorder']
list_display_links = ['title']
list_editable = ['view_num','zan_num','showorder']
admin.site.register(Article,ArticleAdmin)
(如果)遇到问题:类型显示有些奇怪:ArType object
配置类型的__str__返回类型的名称,在类型的models中设置魔术方法__str__
djangoblog>>ar_type>>migrations>>models.py
def __str__(self):
return self.name
上传图片的配置-后台,配置上传图片的存储路径、指定上传资源的访问路径
djangoblog>>djangoblog>>settings.py
# 指定上传资源的访问路径
MEDIA_URL = '/media/'
# 上传资源的存储路径
MEDIA_ROOT = os.path.join(BASE_DIR,'static/media')
跳回路由 djangoblog>>djangoblog>>urls.py
from django.conf.urls.static import static
from djangoProject import settings
urlpatterns += static(settings.MEDIA_URL,document_root=settings.MEDIA_ROOT)
假设这时候项目已经完成了,(换设备运行的时候不知道原来安装的库)需要将安装包整理到requirements.txt里面
pip freeze > requirements.txt
创建虚拟环境
下载后安装:pip install -r requirements.txt
使用富文本编辑器
1.安装django-tinymce(pip install django-tinymce)
djangoblog>>djangoblog>>settings.py 补充
INSTALLED_APPS = [
'tinymce',
]
TINYMCE_DEFAULT_CONFIG = {
'theme':'silver', # 主题
'language':'zh_CN', # 语言
'menubar':'edit format', # 菜单栏
'plugins':'lists,advlist bold underline alignleft aligncenter alignright fontselect fontsizeselect code image link table',
'toolbar':'bullist numlist bold underline alignleft aligncenter alignright fontselect fontsizeselect code image link table',
'images_upload_url': '/uploadImg/', # 图片上传处理视图
'width':600, # 富文本编辑器的宽
'height':400, # 富文本编辑器的高
}
路由配置:djangoblog>>djangoblog>>urls.py
from django.conf.urls import url,include
url(r'^tinymce', include('tinymce.urls')),
djangoblog>>article>>models.py
将 content = models.TextField(verbose_name='文章内容')注释掉
补充 from tinymce.models import HTMLField 完整代码如下:
from django.db import models
from db.baseModel import BaseModel
from ar_type.models import ArType
from tinymce.models import HTMLField
# Create your models here.
class Article(BaseModel):
title = models.CharField(max_length=200,verbose_name='文章标题')
post_img = models.ImageField(upload_to='poster',verbose_name='封面图片')
author = models.CharField(max_length=20,verbose_name='作者姓名')
desc = models.TextField(verbose_name='文章简介')
# content = models.TextField(verbose_name='文章内容')
content = HTMLField(verbose_name='文章内容')
view_num = models.IntegerField(default=0,verbose_name='浏览人数')
zan_num = models.IntegerField(default=0,verbose_name='点赞人数')
type = models.ForeignKey(ArType,verbose_name='文章类型')
class Meta:
db_table = "article"
verbose_name_plural = '文章'
这时候肯定会报错,因为这是版本问题。
报错:from django.urls import path --- django2的语法
解决:from django.conf.urls import url -- 改为django1的语法
url()
我的另一篇文章——关于富文本编辑器的Django之富文本编辑器_Zionnnnnnnn的博客-优快云博客
自定义图片上传的视图函数
djangoblog>>djangoblog>>新建 utils.py
import os
from datetime import datetime
from django.http import HttpResponse, JsonResponse
def uploadImg(request):
imgObj = request.FILES.get('file')
from django.conf import settings
imgName = str(int(datetime.today().timestamp())) + imgObj.name
fname = os.path.join(settings.MEDIA_ROOT, imgName)
with open(fname, "wb") as rfile:
data = imgObj.file.read()
rfile.write(data)
# alt+enter 引入库
return JsonResponse({
"location": '/media/' + imgName
})
路由配置:djangoblog>>djangoblog>>urls.py
from .utils import uploadImg
urlpatterns = [
url(r'^uploadImg/', uploadImg),
]
也许会报错: Forbidden (CSRF token missing or incorrect.): /uploadImg/
原因:图片上传默认是post请求
解决办法:让上传图片视图函数不进行csrf检查
from django.views.decorators.csrf import csrf_exempt
urlpatterns = [
url(r'^uploadImg', csrf_exempt(uploadImg)),
]
问题:上传成功后,tinymce会以当前的url地址为准为图片路径添加相对路径:data-mce-src="../../../../media/XXXXXXXXX.jpg"
表现:富文本编辑器里面上传成功的图片显示不正确
解决:配置tinymce:
'relative_urls':False, // 相对路径设置为False
'remove_script_host': True, // 主机+端口号作为前缀路径
djangoblog>>djangoblog>>settings.py
TINYMCE_DEFAULT_CONFIG = {
'theme':'silver', # 主题
'language':'zh_CN', # 语言
'menubar':'edit format', # 菜单栏
'plugins':'lists,advlist bold underline alignleft aligncenter alignright fontselect fontsizeselect code image link table',
'toolbar':'bullist numlist bold underline alignleft aligncenter alignright fontselect fontsizeselect code image link table',
'images_upload_url': '/uploadImg/', # 图片上传处理视图
'relative_urls':False, # // 相对路径设置为False
'remove_script_host':True, # // 主机+端口号作为前缀路径
'width':600, # 富文本编辑器的宽
'height':400, # 富文本编辑器的高
}
未完待续下次一定......