博客的数据库设计
文章-article:
id - 文章编号
title - 文章标题
post_img 封面图片
author - 文章作者
desc - 简介
content - 内容-富文本
view_num - 浏览量 - 打开一次页面+1
zan_num - 点赞量 - 用户点击一次+1
showorder 排序,越大越靠前
is_delete -状态-默认为0,正常,1为删除
create_time - 创建时间
update_time - 更新时间
type - 分类id 外键
首先先进行Django之虚拟环境-virtualenv配置
Django之虚拟环境-virtualenv配置_Zionnnnnnnn的博客-CSDN博客
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的博客-CSDN博客
自定义图片上传的视图函数
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, # 富文本编辑器的高 }
未完待续下次一定......
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)