Django2.x搭建部落格

SilenceHL發表於2021-05-15

宣告:以下內容均為我個人的理解,如果發現錯誤或者疑問可以聯絡我共同探討

簡介

學完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 協議》,轉載必須註明作者和本文連結

相關文章