Django搭建個人部落格(二)

gamebus發表於2021-09-09

更換資料表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 modelsdef 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:pycharmPyCharm 2018.2binrunnerw.exe" C:Users19244AppDataLocalProgramsPythonPython36-32python.exe "D:pycharmPyCharm 2018.2helperspycharmdjango_manage.py" createsuperuser E:/myblog
Tracking file by folder pattern:  migrations
Username (leave blank to use '19244'):  admin
Email address:  admin@admin.comWarning: Password input may be echoed.Password:  sixkeryWarning: Password input may be echoed.
Password (again):  sixkery123Error: 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 adminfrom 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 modelsclass 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 renderfrom django.http import HttpResponsefrom . import modelsdef 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 pathfrom . 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 pathfrom . 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 adminfrom blog.models import Article

admin.site.register(Article)

我們看到Article類是透過admin方法直接註冊到後臺管理系統的,那我們從這裡改一下:

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

admin.site.register(Article,ArticleAdmin)



作者:sixkery
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2819219/,如需轉載,請註明出處,否則將追究法律責任。

相關文章