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 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 下面就把我們的部落格完善一下吧。
部落格頁面設計
主要由三個頁面組成
部落格主頁面
部落格文章內容頁面
部落格寫作撰寫頁面
主頁面內容
這裡是我們部落格的入口頁面主要有以下兩個內容
文章標題列表,超連結
發表部落格的按鈕(超連結)
編寫思路
從資料庫中取出所有的文章物件
將文章打包成列表,傳遞到前端
前端頁面把文章以標題超連結的形式逐個列出
模板 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Django搭建個人部落格:前言Django
- Django搭建個人部落格:編寫部落格文章的Model模型Django模型
- beego搭建個人部落格(二)Go
- Django搭建個人部落格:文章標籤功能Django
- Django搭建個人部落格:結束和開始Django
- Django搭建個人部落格:在Windows中搭建開發環境DjangoWindows開發環境
- Django搭建個人部落格:用django-notifications實現訊息通知Django
- Django搭建個人部落格:使用django-ckeditor富文字編輯器Django
- Django2.x搭建部落格Django
- Django搭建個人部落格:重置使用者密碼Django密碼
- Django搭建個人部落格:基於類的檢視Django
- Django搭建個人部落格:使用者的註冊Django
- Django搭建個人部落格:使用者的刪除Django
- hexo搭建個人網站部落格完全教程Hexo網站
- 如何搭建個人獨立部落格網站?網站
- Django搭建個人部落格:建立並配置APP功能模組DjangoAPP
- Django搭建個人部落格:給文章加個漂亮的標題圖Django
- 搭建個人部落格
- Django搭建個人部落格:用django-mptt實現多級評論功能Django
- Django搭建個人部落格--使用者的登入和登出Django
- 個人部落格搭建( wordpress )
- Django搭建個人部落格:使用Form表單類發表新文章DjangoORM
- 基於mkdocs-material搭建個人靜態部落格
- 個人搭建部落格的幾種方法和方案
- Django手擼一個部落格專案Django
- 個人的小部落格
- 使用 hexo 搭建個人部落格Hexo
- hexo搭建個人部落格心得Hexo
- 使用React搭建個人部落格React
- beego搭建個人部落格(一)Go
- django基礎入門之搭建部落格系統Django
- 基於函式計算快速搭建Django Blog部落格函式Django
- 分享一個我的 Django 部落格專案Django
- 手把手教你用Hexo搭建個人技術部落格Hexo
- hexo+github搭建個人部落格HexoGithub
- MkDocs+Github搭建個人部落格Github
- 使用 Hugo 快速搭建個人部落格Go
- 基於 GitBook 搭建個人部落格Git