宣告:以下內容均為我個人的理解,如果發現錯誤或者疑問可以聯絡我共同探討
簡介
學完Django2.x可以搭建一個個人部落格練練手
教程
建立專案
通過pycharm建立部落格專案與虛擬環境
修改相關設定
允許任何域名
在開發和測試的時候可以將這裡填為*,後期部署上線後修改為指定域名即可
ALLOWED_HOSTS = ['*']
註冊應用
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
# 註冊應用,當使用pycharm建立時會幫我們自動建立
'post.apps.PostConfig',
]
配置模版
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建立專案會自動幫我們建立
配置資料庫
DATABASES = {
'default': {
# 選擇使用的資料庫型別,這裡為mysql
'ENGINE': 'django.db.backends.mysql',
# 資料庫名稱
'NAME': 'djangoblog',
# 資料庫使用者名稱
'USER': 'root',
# 資料庫密碼
'PASSWORD': '123456',
# 資料庫ip,留空預設為localhost
'HOST': '',
# 資料庫埠,留空預設為3306
'PORT': '3306',
}
}
建立mysql資料庫
在註冊完資料庫後建立mysql資料庫
>>> 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資料庫
接下來再進行資料庫遷移
(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 createsuperuser
使用者名稱 (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 |
編寫模型類程式碼
根據資料庫設計表格完成模型類程式碼
# 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
資料庫遷移
(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 User
- 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管理
/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-mdeditor
pip install django-mdeditor
2.在apps中註冊
INSTALLED_APPS = [
...
'mdeditor',
]
3.在media下建立editor資料夾
cd media
mkdir editor
4.整合到路由中
/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中
from mdeditor.fields import MDTextField
class Article(models.Model):
...
content = MDTextField()
...
再次進入admin,選擇文章修改就可以看到整合的markdown編輯器了
實現檢視
首先找到一套你喜歡的模版,將模版下載下來,html部分放入templates中,其他靜態檔案放入static中
將重複出現的部分提取出來,這個根據自己的模版抽取,每個都不相同,靜態檔案載入
如果一次沒有提取好,可以慢慢一點點的抽取,對於一個後端程式設計師來說這個是一個慢工出細活的過程.可以寫一個簡單的檢視,然後開著Django一邊抽取一遍除錯
接下來實現首頁試圖
首先在urls.py中配置路由
DjangoBlog/u rls.py
...
from blog import views
urlpatterns = [
...
path('', views.index, name='index')
]
這裡path裡第一個引數為訪問的url,匹配採用正規表示式,第二個引數為檢視函式,第三個為取的名字
接下來在blog應用的views.py中編寫檢視函式
blog/views.py
...
def index(request):
return render(request, 'index.html')
這樣當我們重新訪問127.0.0.1:8000時,我們修改的前端程式碼就被載入了
接下來我們實現將分類載入,將index檢視修改為一下程式碼
blog/views.py
...
from .models import Category
# 從models裡匯入Category類
def index(request):
categorys = Category.objects.all()
# 把查詢出來的分類封裝到上下文裡
context = {
'categorys': categorys,
}
print(context)
return render(request, 'index.html', context)
在前端程式碼中渲染,我們找到base.html,將ul標籤中的除首頁以外的程式碼改為一下程式碼
<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新增資料
本作品採用《CC 協議》,轉載必須註明作者和本文連結