Django1.8教程——從零開始搭建一個完整django博客(一)


第一個Django項目將是一個完整的博客網站。它和我們博客園使用的博客別無二致,一樣有分類、標簽、歸檔、查詢等功能。如果你對Django感興趣的話,這是一個絕好的機會。該教程將和你一起,從零開始,搭建一個屬於你自己的Django博客站點。

事不宜遲,讓我趕快開始吧!

創建你的第一個Django項目

Django提供了一個命令,可以讓你輕松地創建初始Django項目文件結構。從你的終端運行以下命令:

django-admin startproject mysite 

這將會創建一個名為mysite的Django項目。

讓我們看看Django項目的結構:

|- mysite/   
	|- manage.py   
	|- mysite/
		|- __init__.py     
		|- settings.py     
		|- urls.py     
		|- wsgi.py
  • manage.py: 一個命令行交互文件,用於顯示項目的運行情況,不用對這個文件做任何修改。

  • mysite/: 你項目的目錄下包含着以下文件:

    • __init__.py : 空的Python文件,用來告訴Python將這個項目目錄視為一個Python模塊。
    • settings.py : 項目的配置和設置文件,用命令行生成的Django項目會自動生成默認配置。
    • urls.py : URL配置文件,每一行URL都對應一個相應的視圖(view)
    • uwsgi.py : 配置您的項目,讓它作為一個WSGI程序運行。

生成的settings.py文件默認情況下包括SQLite數據庫設置與Django app列表,我們需要在數據庫中創建初始應用程序的表。

打開終端並運行下面的命令:

cd mysite 
python manage.py migrate

你可以看到以下輸出:

Rendering model states... DONE
Applying contenttypes.0001_initial... OK
Applying auth.0001_initial... OK
Applying admin.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0002_alter_permission_name_max_length... OK
Applying auth.0003_alter_user_email_max_length... OK
Applying auth.0004_alter_user_username_opts... OK
Applying auth.0005_alter_user_last_login_null... OK
Applying auth.0006_require_contenttypes_0002... OK
Applying sessions.0001_initial... OK

至此,初始Django app的表已經創建完畢。

運行開發者服務器

Django會用自帶的輕量級Web服務器來運行你的代碼,不需要花費大量的時間配置生產服務器。當你運行Django開發服務器,它會檢查代碼中的變化,自動重新加載。把你從手動重啟服務器的繁瑣過程中解放出來。然而,它可能不會注意到一些操作,比如向項目添加新的文件,在這些情況下,你將不得不手動重新啟動服務器。

從項目的根目錄中輸入以下命令:

python manage.py runserver

你可以看到以下輸出:

Performing system checks...
System check identified no issues (0 silenced).
November 5, 2015 - 19:10:54
Django version 1.8.6, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.

現在,打開瀏覽器輸入HTTP://127.0.0.1:8000/。看到這個頁面就說明運行成功,如圖所示:

你也可以自定義Django開發服務器主機和端口,或者告訴它你想加載不同的設置文件。例如,您可以運行manage.py命令如下:

python manage.py runserver 127.0.0.1:8001 \ -- settings=mysite.settings

這是方便處理多個環境,需要不同設置的情況。請記住,此服務器只用於開發,不適合用於生產使用。為了部署Django的生產環境,你應該使用一個真正的Web服務器,如Apache,gunicorn應用,或uWSGI。讓其作為一個網絡服務器的網關接口運行它(WSGI)

項目設置

讓我們打開settings.py文件,看一看我們的項目配置。

其中Django常用設置包含在這個文件當中,但這些只是Django設置的一部分。所有設置可以在此看到:https://docs.djangoproject.com/en/1.8/ref/settings/.

  • DEBUG:一個布爾值,該布爾函數用以打開項目的調試模式。如果設置為true,Django會顯示詳細的錯誤頁面。當你移動到一個生產環境,記得必須設置它為False。不要將網站以調試模式部署到生產中,這樣會暴露你的項目的敏感數據。

  • ALLOWED_HOSTS:在調試模式或正在運行測試時,這個選項不起作用。一旦你關閉調試模式,並將你的網站布置在正式的生產環境,就必須在settings.py中添加部署環境的域名/主機,以便允許服務器運行Django站點。

  • INSTALLED_APPS :這個設置告訴Django哪些app是啟用的。默認情況下,Django包含下面application:

    • django.contrib.admin: Django管理站點.
    • django.contrib.auth: Django認證模塊.
    • django.contrib.contenttypes: Django內容類型框架.
    • django.contrib.sessions: Django會話框架.
    • django.contrib.messages: Django消息傳遞框架.
    • django.contrib.staticfiles: Django管理靜態文件的框架.
  • MIDDLEWARE_CLASSES :一個元組,包含需要執行的中間件。

  • DATABASES:是一個用於在項目中使用的,包含所有數據庫的字典。默認的配置使用sqlite3數據庫。

  • LANGUAGE_CODE:為Django項目定義默認的使用語言。

如果你對Django的設置還不是十分了解,不要擔心。在接下來的學習中,你更加了解Django的相關設置。

項目(project)與應用(application)

在本書中,你可能會經常看到項目(project)應用(application)這兩個Django術語。項目通常是指由你生成的Django站點程序以及與站點相關的設置。而應用通常是指包含模塊(models.py)、視圖(views.py)、模板(template)和鏈接(url.py)的一個Python模塊。應用和框架之間相互作用,提供一系列特定的功能。並且,有些應用可以在不同的項目間重用。比如博客、論壇可以用在其他的項目中。

創建一個應用

現在讓我們來創建你的第一個Django的應用。我們將從零開始創建一個博客應用。找到項目的根目錄,運行以下命令:

python manage.py startapp blog

這就創建了一個app的基本結構:

|- blog/
	|- __init__.py     
	|- admin.py     
	|- migrations/
    	|- __init__.py     
	|- models.py     
	|- tests.py     
	|- views.py

admin.py: 用來將你的app注冊到Django的管理站點,只有注冊過的app才能在Django管理后台進行設置與管理。

migrations:這個目錄包含app數據庫的遷移記錄。migrations允許Django來跟蹤你的模型的變化和相應的數據庫同步。

models.py:app數據模型。所有的Django應用程序都需要有一個models.py文件,但這個文件可以是空的。

tests.py: 可以將測試添加到該文件。

views.py:視圖文件用來設置模型的邏輯。每個視圖接收一個HTTP請求,並返回相應的響應。

設計Blog應用的數據模型

我們將為我們的博客定義初始數據模型。一個模型是一個Python類,並且是django.db.models.model的子類。

其中模型中的每個屬性代表一個數據庫字段。Django為定義在models.py的每個模型都建立對應的模型表。當你創建一個模型,Django提供API以方便查詢數據庫。

首先,我們將定義一個模型。將下面幾行添加到博客應用models.py文件:

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

class Post(models.Model):     
	STATUS_CHOICES = (
        ('draft', 'Draft'),
        ('published', 'Published'),
    )
    title = models.CharField(max_length=250)     
	slug = models.SlugField(max_length=250, unique_for_date='publish')     
	author = models.ForeignKey(User, related_name='blog_posts')     
	body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)     
	created = models.DateTimeField(auto_now_add=True)     
	updated = models.DateTimeField(auto_now=True)     
	status = models.CharField(max_length=10,                               
	choices=STATUS_CHOICES, default='draft')

    class Meta:         
		ordering = ('-publish',)

    def __str__(self):         
		return self.title

這是我們博客的基本模型。讓我們看看剛剛定義的這個模型的字段:

  • title:這是文章標題屬性。CharField是字符字段,將會轉化成SQL數據庫varchar列。

  • slug: slug屬性經常被用於URLs,slug只包含字母。數字、還有下划線。通過使用slug屬性,我們可以輕而易舉的為我們的文章創建優雅的、SEO友好的鏈接。我們添加了unique_for_date參數,這表示每一個由模型創造的文章實例都有唯一的slug屬性,並且不存在相同的slug字段。

注:比如我們發表了一篇文章,標題是:Django中文教程,那么該怎么設計這篇文章的url呢?我們可以直接將標題作為url地址:
http://www.landsblog.com/blog/category/Django中文教程
但url傳輸過程會經過urlencode編碼
結果就變成:
http%3a%2f%2fwww.landsblog.com%2fartical%2fDjango%e4%b8%ad%e6%96%87%e6%95%99%e7%a8%8b,一長串16進制字符串,既不美觀也不容易被Spider識別,因此用slug來代替標題,為每一篇文章設定一個簡短的,易於識別的標題。比如在該例子中,可以將slug設置成django_course,url設計成:
http://www.landsblog.com/blog/category/djangodoc
是不是美觀了許多?

  • author:此字段是外鍵(ForeignKey)。該字段定義了一個一對多的關系。我們告訴Django,每篇文章都只有一個作者,但是一個作者可以寫多篇文章。對於Author字段,Django將會用相關聯的模型(也就是User模型)的主鍵(PrimaryKey)來創建一個外鍵,建立一個從Post到User的映射關系。在本例中,我們依賴Django認證系統的User模型作為Blog模型的關聯模型。同時我們定義related_name屬性,用以指向從User到Post的映射關系。

  • body:文章的主體內容,將會轉化成SQL數據庫中的文本列。

  • publish:這表明文章的發表日期。我們使用表示當前時間的timezone.now方法作為默認值。

  • created:這表明文章被創建的日期。由於我們使用的是auto_now_add參數,創建對象時將會使用當前時間自動保存。

  • updated:顯示文章最后一次更新時間。由於我們使用的是auto_now參數,保存修改對象的時候,日期會自動更新。

  • status:這是一個顯示文章狀態的屬性。我們使用一個選擇參數,所以這個status的值只能被設置為一個給定的選擇。

正如你所見,Django自帶了許多類型的字段(field),以便你能夠隨心所欲定義自己的模型。

模型類中的元類(Meta)包含元數據,ordering屬性定義了文章的排序順序。當我們查詢數據庫,這些文章將按照發布順序降序排列。

Django使用__str__()方法,用文章的標題來代替名稱'object'。如果不定義__str__()方法,模型生成的實例對象將會以’object‘這個名字顯示在django的管理站點,不宜於管理和修改。

注意:如果你使用的是Python2.x版本,則用__unicode__()來代替__str__()

因為我們要處理的日期,需要安裝pytz模塊。這個模塊提供了Python的時區定義,是SQLite正常工作必不可少的模塊。打開終端輸入下列命令:

pip install pytz

Django自帶支持時區功能,你可以在項目的設置文件中,通過設置USE_TZ來激活時區設置。當你通過命令行創建Django項目的時候,USE_TZ默認設為True。

激活你的應用

為了讓Django持續跟蹤我們的應用變化,為模型創建數據庫表,我們必須激活它。為此,編輯settings.py文件,並在installed_apps設置中添加blog模型。它應該看起來像這樣:

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
)

現在Django已經激活了blog app

創建和應用遷移

為我們的模型在數據庫中創建一個數據表。Django自帶數據遷移系統來跟蹤你的模型變化,並同步至數據庫當中。遷移命令(migration)將會對installed_apps設置中的所有應用進行遷移,始終保持與應用的同步。

首先,需要為我們的模型創建一個遷移記錄的列表:

python manage.py makemigrations blog

將會看到以下輸出:

You should get the following output:
Migrations for 'blog':
	0001_initial.py:
	- Create model Post

Django剛剛在migrations目錄下創建了0001_initial.py文件,你可以打開看看這個遷移文件究竟是什么樣子?

Django將會執行遷移文件中的SQL代碼,來創建blog模型的數據表。sqlmigrate命令可以看到SQL代碼並沒有立即執行。

python manage.py sqlmigrate blog 0001

將會有如下輸出:

BEGIN;
CREATE TABLE "blog_post" ("id" integer NOT NULL PRIMARY KEY 
AUTOINCREMENT, "title" varchar(250) NOT NULL, "slug" varchar(250) NOT 
NULL, "body" text NOT NULL, "publish" datetime NOT NULL, "created" datetime NOT NULL, "updated" datetime NOT NULL, "status" varchar(10) NOT NULL, "author_id" integer NOT NULL REFERENCES "auth_user" ("id"));
CREATE INDEX "blog_post_2dbcba41" ON "blog_post" ("slug");
CREATE INDEX "blog_post_4f331e2f" ON "blog_post" ("author_id");
COMMIT;

根據使用的數據庫的不同,你可能會看到不同的輸出數據。上面的輸出使用的是SQLite。你可以看到Django生成的數據表名稱是由app名稱與小寫的模型名稱組合而成(blog_post),你也可以在元類中使用db_table參數來自定義數據表的名稱。Django自動為每一個模型創建主鍵(Primary_key),當然你也可以在模型的任一屬性中添加primary_key=True來自定義主鍵。

運行以下命令來同步數據庫:

python manage.py migrate

得到以下顯示:

Applying blog.0001_initial... OK

我們剛剛為installed_apps列表中的所有應用創建了數據表,包括了我們定義的blog應用。現在,數據庫反映了我們的模型的當前狀態。

如果你對模型進行添加,刪除,修改字段等操作,或者你添加了新的模型,都必須用makemigrations命令來創建一個新的遷移列表。遷移文件將會持續跟蹤模型的變化,然后你需要運行migrate命令來保證數據庫與模型的同步。

原文鏈接:http://www.landsblog.com/blog/content/djangoexamplecreate
更多教程:http://www.landsblog.com/blog/tag/django


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM