1. 程式人生 > >django學習筆記一:搭建簡易部落格

django學習筆記一:搭建簡易部落格

django是什麼?

Django是一個開放原始碼的Web應用框架,由Python語言寫成。採用了MTV的軟體設計模式,即模型M(model.py)模型T(主要是html檔案)檢視V(View.py)

環境

  • 作業系統:虛擬機器ubuntu 16.04 64bit
  • Django版本 :1.11.3
  • Python版本 : 3.5.2
  • 資料庫:SQLite3(Django自帶)

實現的功能

從資料庫獲得文章資料,顯示在瀏覽器頁面。

文章的具有的屬性

  • 標題
  • 正文
  • 作者
  • 發表時間

程式碼實現

知道了部落格要實現的功能,下面就是如何用程式碼實現我們想要的功能。

建立專案與應用

#專案 相當於容器
django-admin.py startproject esay_blog 
#應用app
django-admin.py startapp blog   

此時整個專案的結構如下:
這裡寫圖片描述

個別檔案的功能

  • manage.py: 呼叫資料庫。
  • settings.py: 專案設定/配置。
  • urls.py: 驅動網站的目錄。
  • wsgi.py: 一個 WSGI 相容的 Web 伺服器的入口,以便執行你的專案。
  • blog:建立的django應用

用下面這條語句在本地執行伺服器

python3 manage.py runserver

執行結果:
這裡寫圖片描述

註冊部落格應用

已經建立好app,需要告訴專案我們的app,便於呼叫。

easy_blog/easy_blog/settings.py
# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog', #註冊的部落格應用
]

設計資料庫(M)

根據功能需要設計如下一個資料庫表。

id 標題 正文 發表時間
1 title 1 text 1 2017-7-19
2 title 2 text 2 2017-7-20

程式碼部分:

easy_blog/blog/models.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.db import models
from django.contrib.auth.models import User

# Create your models here.
class Article(models.Model):
    '''
    文章資料庫
    '''
    #文章標題欄位 CharField相當於sql裡面的char
    title = models.CharField(max_length=70)

    #文章正文欄位
    body = models.TextField()

    #文章的建立時間
    created_time =models.DateTimeField()

我們知道在資料庫中執行的語句為sql語句,所以需要將Python語言翻譯成sql語言執行。

#Django 在 blog 應用的 migrations\ 目錄下生成了一個 0001_initial.py 檔案,這個檔案是 Django 用來記錄我們對模型做了哪些修改的檔案。
python3 manage.py makemigrations
python3 manage.py migrate
#翻譯成資料庫語言

設計模板(T)

在根目錄下建立 templates檔案 ,在templates下面建立一個index.html。

easy_blog/templates/index.html
{% load staticfiles %}
<!DOCTYPE html>
<html>
<head>
    <title>xunalove的部落格</title>

    <!-- meta -->
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- css -->
    <link rel="stylesheet" href="http://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="{% static 'blog/css/bootstrap.min.css' %}">
    <link rel="stylesheet" href="{% static 'blog/css/pace.css' %}">
    <link rel="stylesheet" href="{% static 'blog/css/custom.css' %}">

    <!-- js -->
    <script src="{% static 'blog/js/jquery-2.1.3.min.js' %}"></script>
    <script src="{% static 'blog/js/bootstrap.min.js' %}"></script>
    <script src="{% static 'blog/js/pace.min.js' %}"></script>
    <script src="{% static 'blog/js/modernizr.custom.js' %}"></script>
</head>

<body>
<div class="container">
    <header id="site-header">
        <div class="row">
            <div class="col-md-4 col-sm-5 col-xs-8">
                <div class="logo">
                    <h1><a href="index.html">xunalove的部落格</a></h1>
                </div>
            </div><!-- col-md-4 -->
            <div class="col-md-8 col-sm-7 col-xs-4">
                <nav class="main-nav" role="navigation">
                    <div class="navbar-header">
                        <button type="button" id="trigger-overlay" class="navbar-toggle">
                            <span class="ion-navicon"></span>
                        </button>
                    </div>
                </nav>
            </div><!-- col-md-8 -->
        </div>
    </header>
</div>

<div class="content-body">
    <div class="container">
        <div class="row">
            <main class="col-md-8">
                {% for post in article_list %}
                    <article class="post post-{{ post.pk }}">
                        <header class="entry-header">
                            <h1 class="entry-title">
                                <a href="single.html">{{ post.title }}</a>
                            </h1>
                            <div class="entry-meta">

                                <span class="post-date"><a href="#"><time class="entry-date"
                                                                          datetime="{{ post.created_time }}">{{ post.created_time }}</time></a></span>

                            </div>
                        </header>
                        <div class="entry-content clearfix">
                            <p>{{ post.excerpt }}</p>
                            <div class="read-more cl-effect-14">
                                <a href="#" class="more-link">繼續閱讀 <span class="meta-nav"></span></a>
                            </div>
                        </div>
                    </article>
                {% empty %}
                    <div class="no-post">暫時還沒有釋出的文章!</div>
                {% endfor %}

            </main>
            <aside class="col-md-4">
            </aside>
        </div>
    </div>
</div>
<!-- Mobile Menu -->
<script src="{% static 'blog/js/script.js' %}"></script>
</body>
</html>

設計檢視函式(V)

使用Django裡面的all() 方法從資料庫裡獲取了全部的文章,將結果存在article_list 變數, 同時部落格文章列表是按文章發表時間倒序排列的

blog/views.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.shortcuts import render
from .models import Article

# Create your views here.
def index(request):
    article_list = Article.objects.all().order_by('-created_time')

    #文章列表資料的 article_list 變數傳給了模板
    return render(request, 'index.html', context={'article_list':article_list})

繫結URL和檢視函式

blog/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
   '''
   繫結URL與檢視函式
   把網址和對應的處理函式作為引數傳給url函式
   第一個引數:網址
   第二個引數:處理函式
   第三個引數:別名,顯示在瀏覽器
   '''
    url(r'^$',views.index, name=index),
]

告訴專案的url

easy_blog/urls.py
from django.conf.urls import url,include
from django.contrib import admin

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include('blog.urls')),
]

Admin後臺管理

admin是Django自帶的後臺管理,我們可以在後臺註冊我們的模型,方便寫文章和管理。
建立管理員帳號:

 python3 manage.py createsuperuser

根據要求輸入帳號,郵箱,密碼。
註冊我們的模型:

blog/admin.py
# -*- coding: utf-8 -*-
from __future__ import unicode_literals

from django.contrib import admin
from .models import Article

# Register your models here.
admin.site.register(Article)

啟動伺服器:

python3  manage.py runserver

執行開發伺服器,訪問 http://127.0.0.1:8000/admin/
輸入註冊的帳號和密碼,登進去可以看到我們剛才註冊的Article模型:
這裡寫圖片描述

現在我們在後臺編輯一篇文章:

這裡寫圖片描述

執行開發伺服器,此時就可以看到我們剛剛新增的文章。

這裡寫圖片描述
現在的部落格介面比較簡陋。。

遇到的問題:

怎麼樣修改後臺介面為中文?時區為中國?

解決方法:修改setting.py的LANGUAGE_CODE項就可以實現(修改如下):

把英文改為中文
LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'

把國際時區改為中國時區
TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'

USE_I18N = True

USE_L10N = True

USE_TZ = True

新增文章時候發現新增內容為中文出現編碼錯誤

這裡寫圖片描述
解決方法*:在models.py增加下面程式碼:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

學習資料: