简介
学完 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 添加数据