Django學習(二)——實現個人部落格網站
Django網站快速入門
2.1 個人部落格網站規劃
個人部落格具有以下功能:
- 專案名稱mblog
- 通過admin管理介面張貼、編輯以及刪除貼文
- 使用Bookstrap網頁框架
- 在主頁中顯示每篇文章的標題,及發帖日期
建立專案:
django-admin startproject mblog
cd mblog
python mange.py startapp mainsite
在setting.py中加入'mainsite'
2、建立部落格資料表
python manage.py migrate
Django要使用資料庫,有以下幾個步驟:
- 在models.py中定義需要使用的類(繼承自models.Models)
- 詳細地設定每一個在類中的變數,即資料表中的每一個欄位
- 使用
python manage.py makemigrations mainsite
建立資料庫和Django間的中間檔案 - 使用
python manage.py migrate
同步更新資料庫的內容 - 在程式中使用python的操作方法所定義的資料類,等於是在操作資料庫中的資料表
修改mainsite/models.py內容
from django.db import models from django.utils import timezone # Create your models here. class Post(models.Model): title = models.CharField(max_length=200) slug = models.CharField(max_length=200) body = models.TextField() pub_date = models.DateTimeField(default=timezone.now) class Meta: ordering = ('-pub_date',) def __unicode__(self): return self.title
注:建立一個post類(到時候在資料庫中會有一個對應的資料表)。此類包含幾個專案,title-題目;slug-網址;body-內容;pub-date-發表的時間。
Class Meta 內的設定是指定文章顯示的順序是以pub_date為依據。unicode提供此類所產生的資料型,一個以文章標題作為顯示的內容,增加操作過程中的可讀性,使用unicode而不是str,讓標題支援中文。
pub_date需要一個pytz模組,執行pip install pytz
安裝
讓此模型生效,執行:
python manage.py makemigrations
建立管理員賬號和密碼:
python manage.py createsuperuser
把前面定義的post
納入管理:修改mainsite/admin.py
,並且加上張貼日期和時間等內容:
from django.contrib import admin
from .models import Post
# Register your models here.
class PostAdmin(admin.ModelAdmin):
list_display = ('title','slug','pub_date')
admin.site.register(Post,PostAdmin)
使用*.*.*.*:8000\admin
訪問,建立至少五篇文章,方便後續測試。
簡單說明一下Django的MTV架構(類比MVC)。Django把資料的存取和顯示分為Model、Template以及View。分別對應models.py、template資料夾以及view.py檔案。
- Model——model.py:主要負責定義要存取的資料型別,以Python的class類來定義,在後端Django會自動把這個類中的設定對應的到資料庫系統中,不管使用的是哪一種資料庫。
- View——view.py:負責如何把這些資料存進去或取出等程式邏輯。
- Template——template資料夾:負責把取得的資料用美觀且有彈性的方式輸出。
編輯mainsite/admin.py
from django.contrib import admin
from .models import Post
# Register your models here.
class PostAdmin(admin.ModelAdmin):
list_display = ('title','slug','pub_date')
admin.site.register(Post,PostAdmin)
[email protected]:~/mblog# vim mainsite/views.py
from django.shortcuts import render
from django.http import HttpResponse
from .models import Post
# Create your views here.
def homepage(request):
posts = Post.objects.all()
post_lists = list()
for count, post in enumerate(posts):
post_lists.append(No.{}".format(str(count))+str(post)+"<hr>")
post_lists.append("<small>"+str(post.body.encode('utf-8'))\+"</small><br><br>")
return HttpResponse(post_lists)
首先,把model.py中自定義的Model匯入,然後使用Post.objects.all()取得所有資料項,然後可用for迴圈取出所有內容,再通過HttpResponse輸出到網頁上。
此例中,建立了一個homepage函式來獲取所有文章,並通過迴圈吧它們和蒐集到變數post_lists中,最後使用`return HttpResponse(post_lists)把這個變數的內容輸出到使用者端的瀏覽器頁面中。
然後由urls.py
負責呼叫這個函式。url.py
負責網址和程式間的對應工作。開啟urls.py
匯入來自views.py
的homepage函式並以url對應。
from django.conf.urls import include, url
from django.contrib import admin
from mainsite.views import homepage, showpost
urlpatterns = [
url(r'^$', homepage),
url(r'^admin/', include(admin.site.urls)),
]
寫程式時,顯示的樣子和如何儲存資料或資料內容要分來才比較容易維護,
因此,正確的做法是在views.py
中把資料或資料準備好,然後放到template
中,讓template
中的.html
檔案負責真正顯示的工作。
2.3 網址對應於頁面輸出
如何把前面拿到的資料變得更加美觀?答案是通過模板template。每一個輸出的網頁都可以準備一個或以上對應的模板,這些模板以.html
的檔案形式儲存在指定的資料夾中,當網站有資料需要輸出時,通過渲染函式(render)把資料存放到模板指定的位置中,得到結果後再交給HttpResponse輸出給瀏覽器。
基本步驟如下:
- 在
setting.py
中設定模板資料夾的位置 - 在
url.py
中建立網址和view.py
中函式的對應關係 - 建立
.html
檔案(例如index.html),做好排版並安排資料要防止的位置 - 執行程式,以
objects.all()
在views.html
中取得資料或資料 - 以render函式把資料(例如posts)送到指定的模板檔案(例如index.html)中
建立templates資料夾,然後把此資料夾名稱加到settings.py的TEMPLTE區塊中(只需修改DIRS所在行即可):
'DIRS': [os.path.join(BASE_DIR, 'templates')],
然後把post和now放到模板(例index.html)中顯示,把views.py
修改如下:
from django.template.loader import get_template
from django.http import HttpResponse
from datetime import datetime
from .models import Post
# Create your views here.
def homepage(request):
template = get_template('index.html')
posts = Post.objects.all()
now = datetime.now()
html = template.render(locals())
return HttpResponse(html)
這裡使用了一個小技巧把變數放到模板中,就是使用local()函式。這個函式會把當前記憶體中的所有區域性變數使用字典型別打包起來。在模板中因為接收到了所有區域性變數,所有也可以把posts和now都拿來使用。
在templates
目錄下,建立一個名為index.html
的模板檔案:
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>
歡迎觀臨我的部落格
</title>
</head>
<body>
<h1>歡迎觀臨我的部落格</h1>
<hr>
{% for post in posts %}
<p style='font-family:微軟雅黑;font-size:14pt;font-weight:bold;'>
<a href='/post/'{{post.slug}}'>{{ post.title }}</a>
</p>
<% endfor %>
<hr>
<h3>現在時刻:{{ now }}</h3>
</body>
</html>
使用{{}}用來輸出收到的資料,每一個數據項的欄位都是以post.body、post.title的方式取出。
通過<a href>
HTML標籤取出post.slug,建立為連結網址,並放在post/下。
網址對應url.py
要識別這些網址以便對應到要顯示的單篇文章內容,有如下幾步:
- 在
url.py
中設定,只要是/post/開頭的網址,就把後面接著的文字當做引數傳送slug給post_detail顯示單篇文章的函式。 - 在
view.py
中新增一個post_detail
函式,除了接受request引數外,也接受slug引數 - 在templates資料夾中建立一個用來顯示單篇文章的post.html
- 在
post_detail
函式中,以slug為關鍵字搜尋資料集,找出是否有符合的專案 - 如果有,就把找到的資料項傳送給render函式,找出
post.html
模板頁進行渲染(即進行網頁顯示),再把結果交給HttpResponse回傳給瀏覽器 - 如果沒有符合的專案,就把網頁傳回首頁
mblog/urls.py
做如下修改:
from django.conf.urls import include, url
from django.contrib import admin
from mainsite.views import homepage, showpost
urlpatterns = [
url(r'^$', homepage),
url(r'^post/(\w+)$', showpost),
url(r'^admin/', include(admin.site.urls)),
]
把所有/post開頭的網址都找出來,作為當做第二個引數(第一個是預設的request)傳給showpost函式。
同時在views.py中新建這個函式來處理收到的引數,內容如下:
from django.template.loader import get_template
from django.http import HttpResponse
from datetime import datetime
from .models import Post
from django.shortcuts import redirect
# Create your views here.
...
def showpost(request, slug):
template = get_template('post.html')
try:
post = Post.objects.get(slug=slug)
if post != None:
html = template.render(locals())
return HttpResponse(html)
except:
return redirect('/')
加上意外處理,在搜尋發生意外時以redirect(‘/’)的方式直接返回首頁。
顯示文章的post.html
內容如下
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>
歡迎觀臨我的部落格
</title>
</head>
<body>
<h1>{{ post.title }}</h1>
<hr>
<p style='font-family:微軟雅黑;font-size:12pt;letter-spacing:2pt;'>
{{ post.body }}
</p>
<hr>
<h3><a href='/'>回首頁</a></h3>
</body>
</html>
相關推薦
Django學習(二)——實現個人部落格網站
Django網站快速入門 2.1 個人部落格網站規劃 個人部落格具有以下功能: 專案名稱mblog 通過admin管理介面張貼、編輯以及刪除貼文 使用Bookstrap網頁框架 在主頁中顯示每篇文章的標題,及發帖日期 建立專案: dja
Python Django 學習 (二) 【Django 模型】
注: 由於自己排版確實很難看,本文開始使用markdown編輯,希望有所改善 官方定義 A model is the single, definitive source of information about your data. It contains the essential fields and
搭建自己的技術部落格系列(二)把 Hexo 部落格部署到 GitHub 上
1、在GitHub上建一個新倉庫 2、配置Git的SSH KEY 生成SSH新增到GitHub 回到你的git bash中, git config --global user.name "yourname" git config --global user.email "youremail" 這裡的y
基於Flask實現個人部落格網站
一 專案需求 功能需求:基於Flask框架,實現個人部落格 ,包括主頁,文章列表頁,文章詳情頁二 專案核心流程 資料庫 函式和渲染 處理表單並跳轉 讀取資料和渲染 三 專案程式碼實現
【nodeJS】從nodejs原生的部落格網站搭建到 koa框架實現個人部落格網站搭建
nodejs實現搭建部落格網站前言:原java後端渣渣一枚,因專案需要轉學了nodejs進行開發,正式進行專案開發之前,師傅安排了一些專案訓練,先熟悉js語法,然後熟悉nodejs,再慢慢重構向框架的使用。 寫這一篇文章的目的在於記錄自己學習的歷程,同時也是給其他的no
Django-CRM項目學習(二)-模仿admin實現stark
sco auto add 有一個 分享圖片 loading nbsp als -i 開始今日份整理 1.stark模塊基本操作 1.1 stark模塊的啟動 保證django自動的加載每一個app下的stark.py文件 創建django項目,創建stark項目
python程式設計:從入門到實踐學習筆記-Django入門(二)
建立網頁:學習筆記主頁 使用django建立網頁通常分三個階段:定義URL、編寫檢視和編寫模板。 首先必須定義URL模式,其描述了URL是如何設計的,讓django知道如何將瀏覽器請求與網站URL匹配,以確定返回哪個網頁。每個URL都被對映到特定的檢視——檢視函式獲取並處理網頁所需的資料。檢視函
嵌入式核心及驅動開發之學習筆記(二) 實現應用控制驅動
Linux系統根據驅動程式實現的模型框架將裝置驅動分成字元裝置驅動、塊裝置驅動、網路裝置驅動三大類。這裡簡單理解一下概念 字元裝置:裝置按位元組流處理資料,通常用的串列埠裝置、鍵盤裝置都是這種。 塊裝置:裝置按塊單位對資料處理,通常是儲存裝置。 網路裝置:顧名思義,建立在soc
vue 雙向資料繫結的實現學習(二)- 監聽器的實現
廢話:上一篇https://www.cnblogs.com/adouwt/p/9928278.html 提到了vue實現的基本實現原理:Object.defineProperty() -資料劫持 和 釋出訂閱者模式(觀察者),下面講的就是資料劫持在程式碼中的具體實現。 1.先看如何呼
vue 雙向數據綁定的實現學習(二)- 監聽器的實現
view 編譯 代碼 圖片 eve 什麽 als 模板變量 server 廢話:上一篇https://www.cnblogs.com/adouwt/p/9928278.html 提到了vue實現的基本實現原理:Object.defineProperty() -數據劫持 和
tensorflow學習筆記(二)實現MNIST
import tensorflow as tf from tensorflow.contrib import rnn import numpy as np import input_data input_vec_size = lstm_size = 28 time_st
深度學習(二)——從零自己製作資料集到利用deepNN實現誇張人臉表情的實時監測(tensorflow實現)
一、背景介紹 這篇文章主要參考我的上一篇文章:深度學習(一)——deepNN模型實現攝像頭實時識別人臉表情(C++和python3.6混合程式設計)。由於上一篇文章的模型所採用的資料集為fer2013,前面也介紹過這個基於這個資料集的模型識別人臉表情的準確率大概在70%左右
reids叢集學習(二)使用jedis實現redis叢集客戶端
上一節我記錄瞭如何搭建redis官方的叢集,這節我就開始講怎麼用jedis實現叢集環境下的客戶端。 jedis中實現叢集的客戶端類是redis.clients.jedis.JedisClust
TensorFlow深度學習框架學習(二):TensorFlow實現線性支援向量機(SVM)
SVM的原理可以參考李航的《統計學習方法》 具體程式碼如下,程式碼都有註釋的 #1、匯入必要的庫 import matplotlib.pyplot as plt import numpy as np import tensorflow as tf fro
django實戰(二)一個較完整的部落格系統
昨天實現了一個簡單的部落格顯示系統,今天實現一個較為完整的部落格系統,當然還未進行完整的介面優化,但是釋出還是可以實現的。 一、資料庫的構建(M) 首先,我們分析一個部落格系統的功能: (1)一個部落格可以有多個標籤(多對多)
Django學習筆記二:實現部落格詳情,完善文章的分類和標籤
前面我已經學會了使用Django框架搭建一個簡單的部落格框架。接下來學習的就是如何完善部落格的功能。 部落格詳情 功能 當用戶點選文章的“繼續閱讀”按鈕時,實現瀏覽文章的具體內容。即當點選“繼續閱讀”時根據傳入的請求和文章的id引數跳轉到對應的
Spring Boot 構建企業級部落格學習(二)
第一個hello word 專案 編寫專案構建資訊 編寫程式程式碼 編寫測試用例 配置Gradle Wrapper 執行程式 編寫專案構建資訊 修改版本號 0.0.1-SNAPSHOT 改為 1.0.0 修改依賴倉庫地址,使用
【day 11】python程式設計:從入門到實踐學習筆記-基於Django框架的Web開發-Django入門(二)
學習筆記目錄 第十八章 Django入門(二) 建立應用程式 django專案由一系列應用程式組成,他們協同工作,讓專案稱謂一個整體。首先我們執行命令python manage.py startapp learning_logs。 定義模型
利用Word和Github製作個人部落格網站(二)
前言 在前面第一篇已經介紹了怎樣建立一個用Word製作的部落格首頁。連結 這篇進一步完善我們的部落格體系,閱讀完此篇基本就可以了。更多奇淫技巧,不定期分享。 一、建立部落格目錄網頁 1,在資料夾中建立一個word命名為directory.docx,然後開啟,製作目
Django入門學習(二)
1、更改server埠號 ,紅色部分自定義埠號python manage.py runserver 90002、報錯:Quit the server with CTRL-BREAK.Error: [WinError 10013] 以一種訪問許可權不允許的方式做了一個訪問套接