寫在前面:無論遇到什麼困難,都要微笑面對呀!!!加油加油
以此來記錄個人博客開發歷程
1.前端頁面選擇
爲自己的博客選擇好看的前端頁面,因爲我是自學Python + Django後端開發,不瞭解前端內容,所以直接在模板網站下載好看的界面來修改即可。我選擇的前端模板來自楊青青個人博客,選擇完成下載即可。(也可以從17素材網等地方下載,有的是需要VIP和金幣的,就只能八仙過海,各顯神通了;我這邊有十個前端模板,若同學需要可以私信或者留言)
2.博客功能構思
在寫代碼之前,需要對要實現的博客功能和界面做一個簡要規劃,磨刀不誤砍柴工嘛。
實現的功能
- 查看下載的前端頁面,有主頁、關於我、留言頁、博客詳細頁、博客分類頁
- 博客展示 首頁:展示博客標題、摘要、作者等簡要信息,點擊可以進入博客詳細頁;博客詳細頁:展示完整的博客內容;可以根據博客分類、博客標籤進入該類的博客展示頁。
- (不會很全,只是大概羅列了一個方向,大概根據前端頁面來開發,前端頁面有什麼接口就開發什麼內容)
業務邏輯分析
- 博客表:標題、作者、摘要、發佈日期、分類、標籤、閱讀量、評論(在之後的開發中沒有設計評論,問就是前端頁面沒有添加評論的地方,俺自己寫的太醜,遂暫時放棄)、內容
- 留言表:暱稱、郵箱、內容、創建時間
- 博客分類表:分類名
- 博客標籤表:標籤名
- 備註:在進行業務邏輯分析的過程中,有許多不完善的地方,需要結合開源項目來完善
接下來,準備開發model層
3. Model層開發
本項目使用PyCharm-2019.3開發
- 新建Django項目
- 在終端使用命令創建博客(blog)子應用
django-admin startapp blog
- 在settings.py中添加apps,修改數據庫、語言類型和時區
- 使用PyCharm連接數據庫,在General 中輸入登錄用戶名和密碼,在Advanced中修改serverTimezone 爲 Asia/Shanghai(這是因爲在創建數據庫或表的時候,MySQL可能會報時區錯誤異常,在這裏設置以解決該問題)
- 在settings.py中數據庫配置中 ’NAME‘ 對應的數據庫名爲blog(個人創建,可根據需要自行設置),在MySQL中創建數據庫(MySQL大小寫不敏感,所以數據庫名可以直接用 blog 就好,這樣在後面看起來舒服一點,圖就不改了…汗)
- 博客表結構的創建
- 博客表
列名 | 字段名 | 字段類型 |
---|---|---|
主鍵 | id | AutoField |
博客標題 | blogTitle | CharField |
博客作者 | blogAuthor | ForeignKey |
博客摘要 | abstract | CharField |
發佈日期 | createDatetime | DateTimeField |
種類 | category | ForeignKey |
標籤 | tags | ManyToManyField |
博客正文 | text | TextField |
瀏覽量 | viewsCount | PositiveIntegerField |
評論數 | commentsCount | PositiveIntegerField |
外鍵約束說明:博客表中的作者、種類、標籤分別與用戶表、種類表、標籤表相關聯。一個作者對應多個博客、一個博客只有一個作者(一對多,ForeignKey);一個博客只有一個種類,一個分類下有多篇博客(一對多,ForeignKey);一篇博客有多個標籤,一個標籤下有多篇博客(多對多,ManyToManyField)。刪除博客,種類、作者不會受影響,刪除作者或種類,該分類下的所有博客被刪除,級聯操作(在一對多的關係中),所以在外鍵約束中加入 on_delete = models.CASADE;
- 博客種類表
列名 | 字段名 | 字段類型 |
---|---|---|
主鍵 | id | AutoField |
博客種類 | name | CharField |
- 博客標籤表
列名 | 字段名 | 字段類型 |
---|---|---|
主鍵 | id | AutoField |
標籤名 | name | CharField |
- 留言表
列名 | 字段名 | 字段類型 |
---|---|---|
主鍵 | id | AutoField |
暱稱 | nickname | CharField |
郵箱 | EmailField | |
內容 | text | TextField |
創建時間 | created_time | DateTimeField |
補充:還需要增加一些關鍵字來約束這些字段,如:blank = True / False : 在Django後臺管理中新增一條內容時該字段是否可以爲空;default = 設置默認值 ; unique = True / False 能否重複;primary_key = 是否是主鍵等。常用字段約束在本篇博客末尾附表…
對博客表結構在前期按照以上表結構創建,在blog/model.py中寫入模型類代碼
from django.db import models
from django.utils import timezone
from django.utils.html import strip_tags
import os, markdown
def save_img(instance, filename):
return os.path.join(filename)
# 博客種類
class Category(models.Model):
id = models.AutoField(verbose_name='主鍵', primary_key=True)
name = models.CharField(verbose_name='種類名', max_length=100, unique=True)
# 在後臺管理界面,顯示時會顯示此處定義的 verbose_name
class Meta():
verbose_name = verbose_name_plural = '種類表'
# 在後臺管理界面,添加信息需要引用到博客種類時,顯示的是此函數返回的類屬性
def __str__(self):
return self.name
# 標籤,類與方法定義同博客種類
class Tag(models.Model):
id = models.AutoField(verbose_name='主鍵', primary_key=True)
name = models.CharField(verbose_name='標籤名', max_length=100, unique=True)
class Meta():
verbose_name = verbose_name_plural = '標籤表'
def __str__(self):
return self.name
# 博客
class Blog(models.Model):
id = models.AutoField(verbose_name='主鍵', primary_key=True)
blogTitle = models.CharField(verbose_name='文章標題', max_length=70, unique=True)
abstract = models.CharField(verbose_name='摘要', max_length=200, blank=True)
createDatetime = models.DateTimeField(verbose_name='創建時間', blank=True, default=timezone.now)
viewsCount = models.PositiveIntegerField(verbose_name='瀏覽量', default=0, editable=False)
commentsCount = models.PositiveIntegerField(verbose_name='評論數', blank=True, default=0)
# 上傳圖片,重寫 upload_to 方法,其存儲路徑是相對於MEIDA_ROOT而來的,見參考博客 1
imgName = models.ImageField(upload_to=save_img, verbose_name='博客圖片', null=True, blank=True)
text = models.TextField(verbose_name='博客正文')
category = models.ForeignKey(to=Category, on_delete=models.CASCADE, verbose_name='分類', related_name='category_set')
tags = models.ManyToManyField(to=Tag, verbose_name='標籤', related_name='tags_set')
def save(self, *args, **kwargs):
# 首先實例化一個 Markdown 類,用於渲染 body 的文本。
# 由於摘要並不需要生成文章目錄,所以去掉了目錄拓展。
md = markdown.Markdown(extensions=[
'markdown.extensions.extra',
'markdown.extensions.codehilite',
])
# 先將 Markdown 文本渲染成 HTML 文本
# strip_tags 去掉 HTML 文本的全部 HTML 標籤
# 從文本摘取前 54 個字符賦給 excerpt
self.abstract = strip_tags(md.convert(self.text))[:100] + '...'
super().save(*args, **kwargs)
class Meta():
verbose_name = verbose_name_plural = '博客表'
def __str__(self):
return self.blogTitle
# 當調用該方法,瀏覽量增加。
# 調用 self.save() 保存這個修改過的類的實例,
# update_fields 用來指定哪些字段需要更新,別的不更新。默認是None,這樣所有字段都會更新一遍。
# 時候字段很多而我們只需要更新很少的字段,可以用這個參數來提高一下效率。
# 更多詳細內容見參考博客 2
def increase_views(self):
self.viewsCount += 1
self.save(update_fields=['viewsCount'])
# 留言表
class Comment(models.Model):
id = models.AutoField(verbose_name='主鍵', primary_key=True)
nickname = models.CharField(verbose_name='暱稱', max_length=100, default='小豬豬')
email = models.EmailField(verbose_name='郵箱')
text = models.TextField(verbose_name='內容')
created_time = models.DateTimeField(verbose_name='創建時間', default=timezone.now)
class Meta:
verbose_name = '留言表'
verbose_name_plural = verbose_name
- 執行命令
python manage.py makemigrations
python manage.py migrate
- 生成遷移文件,執行遷移文件,在數據庫中創建表,增加字段等操作,替代了我們在數據庫中使用SQL語言進行復雜的操作
有關這兩個命令的區別,請移步【Django2.0】python manage.py makemigrations 和 python manage.py migrate的區別,有關模型類創建,增刪改查等操作,ORM原理等相關知識,需要自行百度。 - 創建完成之後可以在PyCharm 中鏈接 MySQL 查看錶結構是否成功。
補充:
常用字段約束
字段約束 | 含義 | 默認值 |
---|---|---|
primary_key | 是否是主鍵 | False(不是主鍵) |
null | 能否爲空 | False(不能爲空) |
unique | 能否重複 | False(可以重複) |
default | 默認值 | False |
blank | 在Django後臺中能否爲空 | False(不能爲空) |
參考博客: