基于django的个人博客开发

在django的基础上开发个人博客系统

❤️ 这里只放了一个应用的相关操作方式想要整个项目包的可以QQ联系3626446438我会发你哦,当然有问题或者错误都可以评论找我们可以一起debug哦 ❤️

1.配置相关环境开发利用python3.7以及navicate2.2效果较好,下载并为其配置相关环境变量

2.项目搭建

<1创建项目包myblog(可以用便捷方式在你创建的代码存储文件的目录框输入cmd调取本文件下的命令窗口输入admin startproject myblog回车将自动创建好项目包可以利用tree myblog命令检测建立是否成功)
基于django的个人博客开发
<2进入pycharm(可以是其他本次以其为例)file—>open–>找到自己建立的项目的文件位置(要找到myblog的位置)确定将项目在编辑器里打开,点击运行就可以访问到django的欢迎界面
基于django的个人博客开发

<3创建相关应用其实就是要实现博客功能的元素比如博文,使用者等等,建立时可以在编译器自带的命令行(可以使用别的但必需是在myblog即项目文档目录下)输入python manage.py startapp user同样方式创建别的应用,创建好之后每一个应用会有自带的models.py,(后期建表)admin.py(后期注册在后台部署)views.py(用于页面显示)
<4创建好应用之后必须在myblog下的setting.py文件中进行注册具体的在INSTALLDE_APP代码下以相同的格式添加自己创建的app即可
基于django的个人博客开发
<4为了后期更加方便的展示页面可以对时间区及语言进行调整即将下面两行代码进行调整也在setting.py文件中哦LANGUAGE_COOE=‘zh-hans’,TIME_ZONE=‘Asia/Shanghai’,USE_TZ=False

3.对子应用进行操作以其中一个应用为例

<1为用户表添加相关字段即属性创建表在改应用下models.py中写

from django.db import models
#由于手动扩展自带的用户模型类,需要执行下面两行
from django.contrib.auth import get_user_model
from django.utils.html import format_html
from mdeditor.fields import MDTextField
from django.urls import reverse
User=get_user_model()

class Blogs(models.Model):
    STATUS = (
        (1, '公开'),
        (2, '私密'),
    )
    #标题 摘要 内容 (分类 所属标签) 封面图片 阅读量 点赞评论量 (作者) 状态 是否置顶 发表日期 最后修改时间
    title = models.CharField(max_length=100,verbose_name='标题')
    abstract = models.CharField(max_length=255,verbose_name='摘要')
    content = MDTextField(verbose_name='内容')#使用MD富文本编辑器
    #小写的m表示的时中式数字而非
    img = models.ImageField(upload_to='blogs/%Y/%m',verbose_name='封面图')
    readnum = models.IntegerField(default=0,verbose_name='阅读量' )
    commentnum = models.IntegerField(default=0, verbose_name='评论量')
    #状态公开1,私密2,choices参数不加引号并且必需是元组或列表
    status = models.IntegerField(choices=STATUS,verbose_name='状态')
    #删除()逻辑删除而非物理删除
    isDdelete = models.BooleanField(default=False,verbose_name='是否删除')
    isTop = models.BooleanField(default=False,verbose_name='是否置顶')
      createtime = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
    updatetime = models.DateTimeField(auto_now_add=True, verbose_name='修改时间')
    blogtype = models.ForeignKey("type",on_delete=models.PROTECT,verbose_name='所属分类')
    user = models.ForeignKey(User,on_delete= models.PROTECT,verbose_name='作者')
    tags = models.ManyToManyField("tags",related_name="tags",verbose_name='标签')
        class Meta:
        verbose_name = "博文信息"
        verbose_name_plural = verbose_name
        ordering = ('isTop','-createtime',)#必须是元组或列表
    def __str__(self):
        return self.title

   

嗯这里代码中有一部分导包语句是后期才会用的哦这里放上方便大家后期参考
<2在项目目录下创建一个media文件夹将要用到的图片等放在这里,但要让其自己找到图片在这里还需要在setting.py中进行相关配置

#在项目的根目录下创建了存放上传资源的目录:media
#相关配置
MEDIA_URL = 'media/'
#BASE_ROOT:是项目的根目录下面做了根目录和存放目录(路径)的连接
MEDIA_ROOT = os.path.join(BASE_DIR,'media')

以及在总的url.py进行相关配置以相同格式添加

from django.contrib import admin
from django.urls import path, re_path, include
from django.views.static import serve
from myblog import  settings
urlpatterns = [
    #http://127.0.0.1.8000/admin
    #协议,IP,端口PORT不参与匹配,匹配过的内容不再参与匹配,逐一匹配直到匹配到未知这返回404
    path('admin/', admin.site.urls),
#media配置——配合settings中的MEDIA_ROOT的配置,就可以在浏览器的地址栏访问media文件夹及里面的文件了
    re_path(r'media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}),]

<3在字段添加完毕后就进入了创表的关键时候了在编辑器自带 的命令行执行(p在迁移之前要下载一个pillow包)

python manage.py makemigrations
python manage.py migrate

实现迁移文件的生成以及迁移在数据库生成表

<5为了后期对后台部署好操作这里需要创建一个超级用户admin这个在之后就不需要重复操作了哟偶,还是在编辑器自带的命令行执行

pyton manage.py createsuperuser

按照提示写好用户名及密码
<6在该应用下的admin.py中注册,后台部署

from django.contrib import admin
from blogs.models import Blogs
class BlogsAdmin(admin.ModelAdmin):
    # 配置表格所展示那些数据
    list_display = ['title','abstract','blogtype','get_img','readnum','createtime','isTop','status']
    #配置表格所展示数据过滤功能一般选择外键?字段布尔类型或者是列表元组类型类似枚举类型
    list_filter = ['blogtype','isTop','status']
    search_fields = ['title','content','abstract']#模糊查询
    list_editable = ['isTop']#配置那些字段属性可以直接在表格中修改
admin.site.register(Blogs,BlogsAdmin)

<7我的项目中还进行了后台的美化可以不美化
<8在总的项目包下新建一个文件夹templates并在setting.py下进行配置

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',#jinja2
        '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',
            ],
            'libraries': {
                'blogstags': 'blogs.templatestags.blogstags',
            }

        },
    },
]

把本来没有的加上即可,将相关的HTMl文件(在用django模板时就下载了哦)放进来(之后的就不用了一次放完)
<10再新建一个static文件夹将再setting.py下进行配置

STATIC_URL = '/static/'
#格式必须是元组或者列表
STATICFILES_DIRS = [
    os.path.join(BASE_DIR,'static'),
]

将下载好的css,font,font-awesome,image,js,layui,文件放在该文件下
<11配置页面路径在总的url.py下这里我将后期所有的路径配置都放了方便参考

from django.contrib import admin
from django.urls import path, re_path, include
from django.views.static import serve
from myblog import  settings
from django.conf.urls.static import static
urlpatterns = [
    #http://127.0.0.1.8000/admin
    #协议,IP,端口PORT不参与匹配,匹配过的内容不再参与匹配,逐一匹配直到匹配到未知这返回404
    path('admin/', admin.site.urls),
#media配置——配合settings中的MEDIA_ROOT的配置,就可以在浏览器的地址栏访问media文件夹及里面的文件了
    re_path(r'media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}),
    path('mdeditor/', include('mdeditor.urls')),
    # [http://127.0.0.1.8000/]blogs/index/ #博客首页
    #path中只写要匹配和视图,之后如果逻辑视图是函数直接写如果是类写一个as_view()
    path('blogs/', include("blogs.urls", namespace='blogs')),
    #包含评论模块的路径匹配
    # [http://127.0.0.1.8000/]comments/index/
    path('comments/',include("comments.urls",namespace='comments')),
    path('users/', include("users.urls", namespace='users')),

]

<12在该应用下的url.py配置

from django.urls import path
from blogs.views import *
app_name = '[blogs]'
urlpatterns = [
    #博客列表htto://127.0.0.1:8000/blogs/article
    #试图view.py中就是我们的逻辑代码
    #类试图要使用as_view()方法映射
    path('index/', IndexView.as_view(), name='index'),]

<13创建视图在该应用下的view.py文件
请求方式:get post
get:显示请求 所有信息都包括参数信息显示在导航栏 不安全长度有限制
post:隐式请求 用于表单提交不显示相应参数 携带参数安全
页面用到什么请求就写什么请求

from django.core.paginator import Paginator
from django.http import HttpResponseRedirect
from django.shortcuts import render, redirect
from django.views import View
# Create your views here.
import blogs
from blogs.models import *
import markdown

from comments.models import Comment
#定义博客首页 cbv fbv
#view:django中的试图基类
##博客首页htto://127.0.0.1:8000/blogs/index 这是get 方式
class IndexView(View):
    #什么样的请求就定义什么样的方法
    def get(self, request):
        # 进行数据处理获取热门文章可以为点击量多的
        #select* from blogs where isTop=Ture
        #查询数据并获取
        blogslist = Blogs.objects.filter(isDdelete=False, isTop=True)#select* from blogs_blogs
        print(blogslist)
        #处理组织数据
        data = {
            'blogslist': blogslist
        }
        #加载index.html页面# 将数据分配到模板进行渲染
        return render(request, 'index.html',context=data)

<14页面美化,这里要对html文件进型调整找到css,js,img,的相关标签语句利用{%static ‘本来的路径’%}语句改好
基于django的个人博客开发
到这里一个应用的就基本上完成咯,当然可以根据自己的需求不断美化,其他应用与该应用类似。

上一篇:【django云服务器部署流程(1)】django+uwsgi+nginx:准备工作


下一篇:搜索总结1