Django简易项目之博客

Django简易项目之博客,第1张

Django简易项目之博客

博客的数据库设计

类型-type:id int - 类型idname -类型名showorder  排序,越大越靠前,0is_delete -状态-默认为0,正常,1为删除create_time - 创建时间update_time - 更新时间

文章-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,  # 富文本编辑器的高
}

未完待续下次一定......

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5679916.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存