Python:Django搭建博客

2021-08-21 10:22:27 浏览数 (1)

简介

学完 Django2.x 可以搭建一个个人博客练练手

教程

创建项目

通过 pycharm 创建博客项目与虚拟环境

修改相关设置

允许任何域名

在开发和测试的时候可以将这里填为 *,后期部署上线后修改为指定域名即可

ALLOWED_HOSTS = ['*']

注册应用

代码语言:javascript复制
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 注册应用,当使用pycharm创建时会帮我们自动创建
    'post.apps.PostConfig',  
]

配置模版

代码语言:javascript复制
TEMPLATES = [
    {    
        # 选择我们的模板引擎,刚刚用pycharm创建时已选择django自带的模板引擎
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        # 注册我们模版文件夹的位置,刚刚用pycharm创建时已将名字定为`templates`
        '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',
            ],
        },
    },
]

注册完后,在项目根目录中(即 manage.py 所在的目录)创建 templates 文件夹,使用 pycharm 创建项目会自动帮我们创建

配置数据库

代码语言:javascript复制
DATABASES = {
    'default': {
        # 选择使用的数据库类型,这里为mysql
        'ENGINE': 'django.db.backends.mysql',
        # 数据库名称
        'NAME': 'djangoblog', 
        # 数据库用户名
        'USER': 'root',  
        # 数据库密码
        'PASSWORD': '123456', 
        # 数据库ip,留空默认为localhost
        'HOST': '', 
        # 数据库端口,留空默认为3306
        'PORT': '3306', 
    }
}

创建 mysql 数据库

在注册完数据库后创建 mysql 数据库

代码语言:javascript复制
>>> mysql -uroot -p
mysql> create database djangoblog charset=utf8;
mysql> show databases;
 -------------------- 
| Database           |
 -------------------- 
| information_schema |
| blog               | 
| djangoblog         |
| mysql              |
| performance_schema |
| sys                |
 -------------------- 
6 rows in set (0.01 sec)

数据库迁移

接下来进行数据库迁移,并创建 django-admin 管理员

按照之前的文章:Django2.0 正确配置 MySQL,配置好 MySQL 数据库

接下来再进行数据库迁移

代码语言:javascript复制
 (DjangoBlogEnv) hls-MacBook-Pro:DjangoBlog hl$ python manage.py makemigrations
 No changes detected
 (DjangoBlogEnv) hls-MacBook-Pro:DjangoBlog hl$ python manage.py migrate
 Operations to perform:
   Apply all migrations: admin, auth, contenttypes, sessions
 Running migrations:
   Applying contenttypes.0001_initial... OK
   Applying auth.0001_initial... OK
   Applying admin.0001_initial... OK
   Applying admin.0002_logentry_remove_auto_add... OK
   Applying admin.0003_logentry_add_action_flag_choices... OK
   Applying contenttypes.0002_remove_content_type_name... OK
   Applying auth.0002_alter_permission_name_max_length... OK
   Applying auth.0003_alter_user_email_max_length... OK
   Applying auth.0004_alter_user_username_opts... OK
   Applying auth.0005_alter_user_last_login_null... OK
   Applying auth.0006_require_contenttypes_0002... OK
   Applying auth.0007_alter_validators_add_error_messages... OK
   Applying auth.0008_alter_user_username_max_length... OK
   Applying auth.0009_alter_user_last_name_max_length... OK
   Applying auth.0010_alter_group_name_max_length... OK
   Applying auth.0011_update_proxy_permissions... OK
   Applying sessions.0001_initial... OK
出现 Applying sessions.0001_initial… OK 代表 mysql 数据库已配置完成,接下来创建 django-admin 管理员

(DjangoBlogEnv) hls-MacBook-Pro:DjangoBlog hl$ python manage.py createsuperuse
用户名 (leave blank to use 'hl'): silencehl
电子邮件地址: silencehuliang@163.com
Password: 
Password (again): 
密码跟 用户名 太相似了。
密码长度太短。密码必须包含至少 8 个字符。
这个密码太常见了。
Bypass password validation and create user anyway? [y/N]: y
Superuser created successfully.

出现 Superuser created successfully. 这一阶段数据库配置已完成,这里产生的数据库是 Django 自带的一些库

其他设置

区域语言设置,防止 admin 界面乱码

# 设置语言为中文

LANGUAGE_CODE = 'zh-hans'

# 设置时区为上海

TIME_ZONE = 'Asia/Shanghai'

静态文件夹与多媒体文件夹设置

# 设置静态文件目录和名称

STATIC_URL = '/static/'

# 设置静态文件夹目录的路径

STATICFILES_DIRS = (

os.path.join(BASE_DIR, 'static'),

)

# 设置多媒体文件目录和名称

MEDIA_URL = '/media/'

# 设置多媒体文件目录的路径

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

在 settings.py 里设置完毕后,我们在项目中也创建这两个文件在,在项目根目录中创建 static 与 media 这两个文件夹

配置 pycharm 运行参数

配置完成后点击 pycharm 中的运行按钮,在浏览器中输入 127.0.0.1:8000 访问,出现小火箭升空表示 Django 安装成功, 访问 Django-admin 界面, 在浏览器中输入 127.0.0.1:8000/admin,看到 Django 管理,需要输入用户名密码,输入用户名密码后可以跳转到 Django 管理页面表示 Django-admin 设置成功

数据库表分析

文章表

字段 类型 备注

id PrimaryKey 主键

title CharField 标题

create_time DateTimeField 创建时间

views PositiveIntegerField 阅读数

summary TextField 摘要

content TextField 内容

category_id ForeignKey 外键,分类 id

tag_id ManyToManyField 外键,标签 id

分类表

字段 类型 备注

id PrimaryKey 主键

name CharField 分类名

标签表

字段 类型 备注

id PrimaryKey 主键

name CharField 标签名

用户表

字段 类型 备注

id PrimaryKey 主键

name CharField 用户名

password CharField 密码

评论表

字段 类型 备注

id PrimaryKey 主键

user_id ManyToManyField 外键,用户名 id

blog_id ManyToManyField 外键,博客 id

create_time DateTimeField 创建时间

content TextField 评论内容

Parent_id PositiveIntegerField 父评论 id

编写模型类代码

根据数据库设计表格完成模型类代码

代码语言:javascript复制
# DjangoBlog/post/models.py

from django.db import models

class Category(models.Model):
        """分类"""
    name = models.CharField('分类', max_length=100)

    class Meta:
        verbose_name = '分类'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Tags(models.Model):
        """标签"""
    name = models.CharField('标签', max_length=100)

    class Meta:
        verbose_name = '标签'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Article(models.Model):
        """博客"""
    title = models.CharField('标题', max_length=100)
    create_time = models.DateTimeField('创建时间', auto_now_add=True)
    views = models.PositiveIntegerField('阅读数', default=0)
    summary = models.TextField('摘要')
    content = models.TextField('内容')
    category_id = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分类')
    tag_id = models.ManyToManyField(Tags, verbose_name='标签')

    class Meta:
        verbose_name = '文章'
        verbose_name_plural = '文章'

    def __str__(self):
        return self.title


class User(models.Model):
        """用户"""
    name = models.CharField('用户名', max_length=100)
    password = models.CharField('密码', max_length=100)

    class Meta:
        verbose_name = '用户名'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name


class Comment(models.Model):
        """评论"""
    user = models.ManyToManyField(User, verbose_name='用户')
    article = models.ManyToManyField(Article, verbose_name='博客')
    create_time = models.DateTimeField('创建时间', auto_now_add=True)
    content = models.TextField('内容')
    Parent_id = models.PositiveIntegerField('父评论id')

    class Meta:
        verbose_name = '评论'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.content

数据库迁移

代码语言:javascript复制
(DjangoBlogEnv) hls-MacBook-Pro:DjangoBlog hl$ python manage.py makemigrations
Migrations for 'blog':
  blog/migrations/0001_initial.py
    - Create model Article
    - Create model Category
    - Create model Tags
    - Create model Use
    - Create model Comment
    - Add field category_id to article
    - Add field tag_id to article
(DjangoBlogEnv) hls-MacBook-Pro:DjangoBlog hl$ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying blog.0001_initial... OK

用 django-admin 管理

数据库迁移完成会在 post 应用下生成一个迁移的文件,接下来在 django-admin 中注册模型,便于我们用 django-admin 管理

代码语言:javascript复制
/post/admin.py

from django.contrib import admin
from .models import Article, Category, Tags, User, Comment


@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
        # 在后台显示的字段
    list_display = ('id', 'title', 'create_time', 'category_id', 'views')
    # 分页的个数
    list_per_page = 10
    # 按时间倒序排序
    ordering = ('-create_time',)
    # 点击修改的字段
    list_display_links = ('id', 'title')


@admin.register(Category)
class CategoryAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')


@admin.register(Tags)
class TagsAdmin(admin.ModelAdmin):
    list_display = ('id', 'name')


@admin.register(User)
class UserAdmin(admin.ModelAdmin):
    list_display = ('id', 'name', 'password')


@admin.register(Comment)
class CommentAdmin(admin.ModelAdmin):
    list_display = ('id',  'content',  'create_time')

登陆 Django 管理后台,查看模型是否可以被管理,尝试点击添加与修改,没问题就说明注册成功

集成 Markdown

很多人喜欢用 markdown 格式写博客,我们可以通过集成 Django-mdeditor 来实现这个功能

1. 安装 django-mdedito

pip install django-mdedito

2. 在 apps 中注册

代码语言:javascript复制
INSTALLED_APPS = [
...
'mdeditor',
]
3. 在 media 下创建 editor 文件夹

cd media
mkdir edito

4. 集成到路由中

代码语言:javascript复制
/blog/urls.py

from django.conf.urls import url, include
from django.conf.urls.static import static
from django.conf import settings
...

urlpatterns = [
...
url(r'mdeditor/', include('mdeditor.urls'))
]

if settings.DEBUG:
# static files (images, css, javascript, etc.)
urlpatterns  = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

5. 集成到 models 中

代码语言:javascript复制
from mdeditor.fields import MDTextField
class Article(models.Model):
...
    content = MDTextField()

...

再次进入 admin,选择文章修改就可以看到集成的 markdown 编辑器了

实现视图

首先找到一套你喜欢的模版,将模版下载下来,html 部分放入 templates 中,其他静态文件放入 static 中

将重复出现的部分提取出来,这个根据自己的模版抽取,每个都不相同,静态文件加载

如果一次没有提取好,可以慢慢一点点的抽取,对于一个后端程序员来说这个是一个慢工出细活的过程。可以写一个简单的视图,然后开着 Django 一边抽取一遍调试

接下来实现首页试图

首先在 urls.py 中配置路由

代码语言:javascript复制
DjangoBlog/u rls.py
...
from blog import views

urlpatterns = [
     ...
  path('', views.index, name='index')
]

这里 path 里第一个参数为访问的 url,匹配采用正则表达式,第二个参数为视图函数,第三个为取的名字

接下来在 blog 应用的 views.py 中编写视图函数

代码语言:javascript复制
blog/views.py
...
def index(request):
    return render(request, 'index.html')

这样当我们重新访问 127.0.0.1:8000 时,我们修改的前端代码就被加载了

接下来我们实现将分类加载,将 index 视图修改为一下代码

代码语言:javascript复制
blog/views.py
...
from .models import Category

# 从models里导入Category类

代码语言:javascript复制
def index(request):
    categorys = Category.objects.all()
    # 把查询出来的分类封装到上下文里
    context = {
        'categorys': categorys,
    }
    print(context)
    return render(request, 'index.html', context)
Copy

在前端代码中渲染,我们找到 base.html, 将 ul 标签中的除首页以外的代码改为一下代码

代码语言:javascript复制
<header class="header-navigation" id="header">
    <nav>
        <div class="logo"><a href="/">胡亮个人博客</a></div>
        <h2 id="mnavh"><span class="navicon"></span></h2>
        <ul id="starlist">
            <li><a href="index.html">首页</a></li>
        </ul>
    </nav>
</header>

这样分类栏就加载出来了,如果没有数据可以通过 admin 添加数据

0 人点赞