Django搭建個人博客(二)

更換數據表mysql

上文說到編寫好了我們的 model 模塊,映射生成數據表,之前我們用的是Django 默認的數據庫 sqlite3 ,這里我們更改一下使用 mysql。

我們在 navicat for mysql 中新建數據庫 blogdjango 。
至于 navicat for mysql 的安裝及配置請大家自行百度。
在 settings.py 文件中:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME':'blogdjango',
        'USER':'root',
        'PASSWORD':'', # 這里填寫密碼
        'HOST':'127.0.0.1'
    }
}

上文我們映射生成數據表是在 manage.py 的同級目錄下:

E:\myblog>

這里我們在換一種運行方式,目的是多了解一種運行方式。
在pycharm 上方的 Tools 菜單下有一個:

運行manage文件

點擊之后出現:
image.png

如果跟我的不一樣,可能是沒有安裝 mysql 驅動,安裝一下就好了,如果出錯,可以看一下這篇文章

接下來跟上文一樣,執行 makemigrations 和 migrate 。
完成之后,到navicat 查看生成的數據表。:


生成的數據表

這一部分跟上文的大致一樣,只是換一個數據庫,還是可以用 sqlite3 。步驟一樣。
注意到我們自己寫的數據表也在上方
我們在我們編輯的數據表里添加一些字段。


數據表

我們插入了一條記錄。

頁面呈現數據

數據我們有了,我們要把數據展現在頁面上

后臺步驟
  • 在 views.py 中 import models
    article = models.Article.objects.get(pk=1)
    render(request,page,{'article':article})
from . import models

def index(request):
    article = models.Ariticle.objects.get(pk=1)
    return render(request, 'blog/index.html',{'article':article})
后臺步驟

模板可直接使用對象以及對象的 ‘ . ’ 操作
{{article.title}}就可以了
在模板 templates 下的index.html 文件中:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<h3>{{ article.content }}</h3>
</body>
</html>

最后我們啟動一下服務


正確運行

admin 簡介

Admin 是 Django 自帶的一個功能強大的自動化數據管理界面。
自帶的后臺管理系統
被授權的用戶可直接在 Admin 中管理數據庫(增刪改查)
Django 提供了許多針對 Admin 的定制功能

配置 Admin

Django 已經幫我們創建一個 admin 我們只需要創建一個用戶就可以了

  • 創建一個用戶
    python manage.py createsuperuser 創建一個超級用戶
    看一下我的創建過程:
"D:\pycharm\PyCharm 2018.2\bin\runnerw.exe" C:\Users\19244\AppData\Local\Programs\Python\Python36-32\python.exe "D:\pycharm\PyCharm 2018.2\helpers\pycharm\django_manage.py" createsuperuser E:/myblog
Tracking file by folder pattern:  migrations
Username (leave blank to use '19244'):  admin
Email address:  admin@admin.com
Warning: Password input may be echoed.
Password:  sixkery
Warning: Password input may be echoed.
Password (again):  sixkery123
Error: Your passwords didn't match.
Warning: Password input may be echoed.
Password:  sixkery@123
Warning: Password input may be echoed.
Password (again):  sixkery@123
Superuser created successfully.

Process finished with exit code 0

密碼選好,為了保密 。
localhost:8000/admin Admin入口
開啟服務,訪問一下:


登錄管理系統

登錄看一下:


管理系統

看到是英文,好吧,我們改一下顯示成中文
在 settings.py 文件中修改:
LANGUAGE_CODE = 'zh_Hans'

就可以了。再次登錄查看就會顯示中文。
可以顯示中文了,但是我們的數據呢?
這里想要操作數據,還要配置一下應用
在應用下 admin.py 中引入自身的 models 模塊(或里面的模型類)
在 admin.py 文件下添加 admin.site.register(models.Aritcle)

from django.contrib import admin

from blog.models import Ariticle

admin.site.register(Ariticle)

切換瀏覽器,刷新一下頁面:


數據正確顯示

我們可以點進去修改數據等操作。

修改數據庫默認名稱
  • 在 Article 類下添加一個方法
    根據 python 版本選擇
    python 3:str(self)
    python 2:_unicode(self)
    return self.title
    在 models.py 文件下:
from django.db import models


class Ariticle(models.Model):
    # 有必選參數,最大長度
    title = models.CharField(max_length=32,default='Title')
    # 沒有必選參數,這里可以為空
    content = models.TextField(null=True)

    def __str__(self):
        return self.title

改完之后,重新刷新頁面:


更改后

完善博客

通過前面的學習,我們已經大致了解 django 下面就把我們的博客完善一下吧。

博客頁面設計

主要由三個頁面組成

  1. 博客主頁面

  2. 博客文章內容頁面

  3. 博客寫作撰寫頁面

主頁面內容

這里是我們博客的入口頁面主要有以下兩個內容

  • 文章標題列表,超鏈接
  • 發表博客的按鈕(超鏈接)
編寫思路
  • 從數據庫中取出所有的文章對象
  • 將文章打包成列表,傳遞到前端
  • 前端頁面把文章以標題超鏈接的形式逐個列出
模板 for 循環

{% for xx in xxs %}
HTML 語句
{% endfor %}
在 views.py 文件下:

from django.shortcuts import render
from django.http import HttpResponse
from . import models

def index(request):
    # 獲取所有的文章對象
    articles = models.Ariticle.objects.all()
    return render(request, 'blog/index.html',{'articles':articles})

切換到前端:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>
    <a href="">新文章</a>
</h1>
{% for article in articles %}
<a href="">{{ article.title }}</a>
<br/>
{% endfor %}
</body>
</html>

重啟下服務器:


頁面
博客文章頁面

頁面內容

  • 標題
  • 文章內容
  • 修改文章的按鈕(超鏈接)
    代碼:
def index(request):
    # 獲取所有的文章對象
    articles = models.Ariticle.objects.all()
    return render(request, 'blog/index.html',{'articles':articles})

def article_page(request,article_id):
    # 文章頁面
    article = models.Ariticle.objects.get(pk=article_id)
    return render(request,'blog/article_page.html',{'article':article})

在templates文件夾下的blog文件下新建一個 article_page.html 文件:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Article Page</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<br/>
<h3>{{ article.content }}</h3>
<br/><br/>
<a href="">修改文章</a>
</body>
</html>

配置 url

from django.urls import path
from . import views
urlpatterns = [
    path('index/', views.index),
    path('article/<int:article_id>/', views.article_page),
]

這里注意正則表達式的寫法。
啟動服務:


文章頁面

Django 中的超鏈接

超鏈接的目標地址:在 HTML 語言中,href 后面的是目標地址
在 Django
template 中可以用 {%url 'app_name:url_name' param%}
其中 app_name 和 url_name 都在 url 中配置

在配 URL

url 函數的名稱參數

  • 根 urls 寫在 include() 的第二個參數位置, namespace='blog'
  • 應用下則寫在 url() 的第三個參數位置, name='article'
    這兩種方式寫法主要取決于是否使用 include() 引用了另一個 url 配置文件
    根 urls.py
urlpatterns = [
    path('admin/', admin.site.urls),
    path('blog/', include('blog.urls',namespace='blog')),
    path('blog2/', include('blog2.urls')),

]

應用下 urls.py:

from django.urls import path
from . import views
app_name = 'blog' # 這句一定要加
urlpatterns = [
    path('index/', views.index),
    path('article/<int:article_id>/', views.article_page,name='article'),
]

配置之后打開頁面發現鏈接可以使用了

博客撰寫頁面開發

頁面內容

  • 標題編輯欄
  • 文章內容編輯區域
  • 提交按鈕
    首先創建一個 HTML 文件,。命名為 edit_page
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Edit Page</title>
</head>
<body>
<from action="" method="post">
    <label>文章標題
        <input type="text" name="title"/>
    </label>
    <br/>
    <label>文章內容
        <input type="text" name="content"/>
    </label>
    <br/>
    <input type="submit">
</from>
</body>
</html>

前端頁面寫完了,我們分析一下后端怎么寫,這里雖然只有一個編輯的頁面,但是其實涉及到了兩個響應函數,一個是這個頁面本身的響應函數,一個是表單提交的目的地。

在views.py 文件中寫響應函數。

def edit_page(request):
    return render(request,'blog/edit_page.html')

添加 url :

urlpatterns = [
    path('index/', views.index),
    path('article/<int:article_id>/', views.article_page,name='article_page'),
    path('edit/', views.edit_page)

啟動服務就可以看到頁面啦

編輯頁面

接下來完成表單提交的響應函數

這里是接收數據提交給后臺,所以要用到 post 方法
使用request.POST['參數名'] 獲取表單數據
models.Article.objects.create(title,content) 創建對象

def edit_action(request):
    title = request.POST.get('title','TITLE') # 獲取request里的數據
    content = request.POST.get('content','CONTENT') # 獲取request里的數據
    models.article.objects.create(title=title,content=content) # 創建文章對象
    articles = models.Article.objects.all()
    return render(request,'blog/index.html',{'articles':articles}) # 返回主頁面

添加 url

urlpatterns = [
    path('index/', views.index),
    path('article/<int:article_id>/', views.article_page,name='article_page'),
    path('edit/', views.edit_page,name='edit_page'),
    path('edit/action/', views.edit_action,name='edit_action')
]

再把前端的url添加進去

<form action="{% url 'blog:edit_action' %}" method="post">

然后啟動服務,會報錯,原因是Django 的安全模式,不允許隨便提交數據。這里在下方添加:

<form action="{% url 'blog:edit_action' %}" method="post">
    {% csrf_token %}
    <label>文章標題

原本到這里我以為都可以了,結果運行之后沒有報錯,但是卻沒有執行頁面跳轉的動作。老司機一看就知道,哪里寫錯了。對的,確實是寫錯了,但是是哪里呢?
血的教訓啊,排查了老半天也沒整出來,無奈上網找答案。百般搜索無果。哇,真是崩潰。出去溜達一圈再說。
不得不說,pycharm 這個編輯器真好,當你寫錯都會提示,恩,沒錯,就是單詞寫錯了。在我上方貼的代碼中有兩處寫錯了,第一個是models 里的定義類:Ariticle,沒辦法這個寫錯,數據庫都要重新遷移。一頓操作。。。
還有一個,編輯頁面的 HTML 里 form 這個單詞寫成 from 了。
這里就當個教訓好了,希望大家別犯這樣低級的錯誤。手動捂臉。


好了,繼續。
我們在編輯新文章頁面添加了數據跳轉到主頁面:


我們把新文章的鏈接也補充一下:
在主頁的 index.HTML 文件中:

    <a href="{% url 'blog:edit_page' %}">新文章</a>

這樣就OK啦

修改文章

這里要單獨說一下這個功能,修改文章要有文章才能叫做修改,不同于新文章,什么都沒有,所以直接調轉到新文章頁面是不行的。那要怎么做呢?

先來比較一下兩個編輯頁面

新文章為空,修改文章有內容
修改文章頁面有文章對象
那么為什么會有這個對象呢?就是文章的 ID 唯一標識符。
我們把編輯頁面的響應函數修改一下,添加一個id

def edit_page(request,article_id):
    if str(article_id) == '0':
        return render(request,'blog/edit_page.html')
    article = models.Article.objects.get(pk=article_id)
    return render(request, 'blog/edit_page.html',{'article':article})

def edit_action(request):
    title = request.POST.get('title','TITLE') # 獲取request里的數據
    content = request.POST.get('content','CONTENT') # 獲取request里的數據
    article_id = request.POST.get('article','0')
    if article_id == '0':
        # 就編輯文章
        models.Article.objects.create(title=title,content=content) # 創建文章對象
        articles = models.Article.objects.all()
        return render(request,'blog/index.html',{'articles':articles}) # 返回主頁面
    # 這里就是修改文章
    article = models.Article.objects.get(pk=article_id)
    article.title = title
    article.content = content
    article.save()
    return render(request,'blog/article_page.html',{'article':article}) # 跳轉到文章頁面

主頁的 HTML 中修改:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1>
    <a href="{% url 'blog:edit_page' 0 %}">新文章</a>
</h1>
{% for article in articles %}
<a href="{% url 'blog:article_page' article.id %}">{{ article.title }}</a>
<br/>
{% endfor %}
</body>
</html>

文章頁面中的修改文章按鈕出修改(HTML):

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Article Page</title>
</head>
<body>
<h1>{{ article.title }}</h1>
<br/>
<h3>{{ article.content }}</h3>
<br/><br/>
<a href="{% url 'blog:edit_page' article.id %}">修改文章</a>
</body>
</html>

最后是編輯頁面,判斷有沒有文章id,如果有就修改文章,沒有就普通的從空白處編輯文章。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Edit Page</title>
</head>
<body>
<form action="{% url 'blog:edit_action' %}" method="post">
    {% csrf_token %}
    {% if article %}
        <input type="hidden" name="article_id" value="{{ article.id }}"/>
        <label>文章標題
            <input type="text" name="title" value="{{ article.title }}"/>
        </label>
        <br/>
        <label>文章內容
            <input type="text" name="content" value="{{ article.content }}"/>
        </label>
        <br/>
    {% else %}
        <input type="hidden" name="article_id" value="0"/>
        <label>文章標題
            <input type="text" name="title"/>
        </label>
        <br/>
        <label>文章內容
            <input type="text" name="content"/>
        </label>
        <br/>
    {% endif %}
    <input type="submit" value="提交">
</form>
</body>
</html>

這里主要是在創建頁面的時候記得帶上id 唯一標識符,這樣才能順利的操作頁面,編寫邏輯代碼,實現功能。

這樣就可以啦!終于完成了博客的開發,雖然看上去沒有什么新奇的東西,但是一整套的流程下來,讓我們熟悉了 Django 的簡單網頁的開發。

一些小技巧

templates 過濾器

過濾器就是寫在模板中的,屬于 Django 模板語言
它的作用是可以修改模板中的變量,從而顯示不同的內容。
寫法
{{ value | filter }} 例:{{ list_nums | length }}
我們之前寫的編輯頁面的代碼好多重復的,使用一下過濾器:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Edit Page</title>
</head>
<body>
<form action="{% url 'blog:edit_action' %}" method="post">
    {% csrf_token %}
        <input type="hidden" name="article_id" value="{{ article.id | default:'0' }}"/>
        <label>文章標題
            <input type="text" name="title" value="{{ article.title }}"/>
        </label>
        <br/>
        <label>文章內容
            <input type="text" name="content" value="{{ article.content }}"/>
        </label>
        <br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

把if-else 語句也省了,是不是很好玩呀。

admin增強

后臺管理系統

我們想把內容也顯示出來怎么做呢?
我們先來看看我們的 admin.py 文件:

from django.contrib import admin

from blog.models import Article

admin.site.register(Article)

我們看到Article類是通過admin方法直接注冊到后臺管理系統的,那我們從這里改一下:


class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title','content')

admin.site.register(Article,ArticleAdmin)

這樣就可以啦!

總結

到這里就結束了,整個博客開發下來就是熟悉 Django 的過程,當然還有好多好玩的都沒有實現。這個博客就當是入門了解一下Django好了。后面還有更多好玩的東西等著我去探索,希望一起進步!

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,763評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,238評論 3 428
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,823評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,604評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,339評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,713評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,712評論 3 445
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,893評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,448評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,201評論 3 357
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,397評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,944評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,631評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,033評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,321評論 1 293
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,128評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,347評論 2 377

推薦閱讀更多精彩內容