Django學習筆記之——Start

1. 安裝

下載源碼文件: Django-1.6.10.tar.gz
解壓後生成目錄:Django-1.6.10
進入目錄
html

$ sudo python setup.py install

就完成安裝了。
python


2. 建立工程

執行: django-admin.py startproject <工程名>
完成後會在當前目錄下生成<工程名>,好比mysite,的目錄。在該目錄下會有:
mysql

.
|-- manage.py
`-- mysite
    |-- __init__.py
    |-- settings.py
    |-- urls.py
    `-- wsgi.py

其中manage.py管理工具,以後的管理工做都是經過它來完成。git


3. 運行網站

$ ./manage.py runserver
Validating models...

0 errors found
March 02, 2015 - 11:33:33
Django version 1.6.10, using settings 'mysite.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
[02/Mar/2015 11:33:45] "GET / HTTP/1.1" 200 1757

默認端口爲8000web

用本地瀏覽器訪問: 127.0.0.1:8000sql


4. 建立應用

$ ./manage.py startapp <應用名>

應用名能夠隨便取,但要符合python標識符的命名規範。好比:blogshell

在建立以後,在當前目錄(manager.py所在目錄)下生成blog目錄。內容以下:
數據庫

.
|-- admin.py
|-- __init__.py
|-- models.py
|-- tests.py
|-- urls.py      #python3沒有,能夠本身建
`-- views.py


4.1 將應用加入到mysite

編輯mysite/settings.pydjango

在INSTALLED_APPS中加入blog
瀏覽器

INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    ...(略)
    'blog'
)


4.2 配置數據庫

還要配置數據庫,告訴mysite用什麼數據庫。一樣是在settings.py中,配置DATABASES

DATABASES = {
    'default' : {
        'ENGINE' : 'django.db.backends.sqlite3',
        'NAME' : os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

默認配置是sqlite3,固然也能夠用其它的數據庫,如mysql。
以下是mysql的配置:

DATABASES = {
    'default' : {
        'ENGINE' : 'django.db.backends.mysql',
        'NAME' : 'djangodb',
        'HOST' : 'localhost',
        'USER' : 'paul',
        'PASSWORD' : 'pony' # secret!
    }
}

因爲系統自帶sqlite3,那就用默認的吧。


4.3 models.py中定義模型

在mysite/blog/models.py中實義數據庫對應的模型。
好比:

from django.db import models
class BlogPost(models.Model):
    title = models.CharField(max_length=150)
    body = models.TextField()
    timestamp = models.DateTimeField()

上面就定義了一個BlogPost的模型。其對應數據庫的一張名爲blog_blog_post的表。

BlogPost中的每一個屬性對應着表中的一個Field,也就是列。好比上面的:title, body, timestamp。

而這些屬性所對應的對象着代表了域的特性。
models.CharField ---> char[n]
models.TextField ---> text
models.DateTimeField ---> DateTime
models.BooleanField ---> bool
models.IntegerField ---> int
要使用上面的這些models,必須得from django.db imports models

django.db.models中的Model定義在:  lib/pythonx.x/site-packages/django/db/models/fields/__init__.py 中。

注:在對models.py進行修改以後都要同步一下數據庫。

$ python manage.py syncdb
Creating tables ...
Creating table django_admin_log
Creating table auth_permission
Creating table auth_group_permissions
Creating table auth_group
Creating table auth_user_groups
Creating table auth_user_user_permissions
Creating table auth_user
Creating table django_content_type
Creating table django_session
Creating table blog_blogpost

You just installed Django's auth system, which means you don't have any superusers defined.
Would you like to create one now? (yes/no): yes    #輸入yes
Username (leave blank to use 'hevake_lcj'): sa     #管理員賬戶
Email address: 
Password:                                          #設置密碼
Password (againUsername (leave blank to use 'hevake_lcj'): sa
Email address: 
Password: 
Password (again): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)): 
Superuser created successfully.
Installing custom SQL ...
Installing indexes ...
Installed 0 object(s) from 0 fixture(s)


4.3.1 將model加入到admin管理

在定義了Person以後,若是想要讓admin工具管理。那麼就得註冊。

打開mysite/blog/admin.py

from django.contrib import admin
from models import *   #導入models.py

admin.site.register(BlogPost)


這樣以來,開啓服務後,咱們就能夠經過訪問: http://127.0.0.1:8000/admin/blog/

輸入剛剛設定的賬號密碼,而後Login登錄。


點Blog posts,進去添加一個Model對象。

保存Save。

路徑上管理咱們的BlogPost模型了。

Django中的admin不是其必須的模塊,可是它是管理網站頗有用的工具。


4.3.2 指定admin頁面列表中要顯示的域

可是,上面這麼作還不能很好在地admin的blog_post頁面展示咱們的BlogPost對象。顯示的是「BlogPost object」

由於admin並不知道該怎麼顯示到列表上。

爲了在admin的網面上更好地展示,一般咱們要爲model(如:BlogPost)添加一個Admin類進行管理,指定哪些域要顯示的網頁列表上。

打開mysite/blog/admin.py文件,添加BlogPostAdmin類,以下:

class BlogPostAdmin(admin.ModelAdmin):
    list_display = ('title', 'timestamp')

在這個類中有一個list_display屬性,說明列表中要顯示的是title與timestamp兩個域。
而後將原來的:

admin.site.register(BlogPost)

改爲:

admin.site.register(BlogPost, BlogPostAdmin)
#                             ^^^^^^^^^^^^^

而後,咱們再刷新一下剛剛的頁面:http://127.0.0.1:8000/admin/blog/blogpost/


4.4 添加html模板

在 blog/ 目錄下新建 templates 目錄,全部的模板都是從template目錄下去查找的。

blog
|-- templates
    `-- archive.html


在mysite/blog/templates/目錄建立一個模板archive.html

{% for post in posts %}
<h2>{{ post.title }}</h2>
<p>{{ post.timestamp }}</p>
<p>{{ post.body }}</p>
{% endfor %}

模板的功能是用於描述如何生成html文件。
當接受到請求時,view會將template與model進行結合生成對應的html文件。


4.5 添加view

在例子中view的功能更像是請求處理函數。它接受請求,並返回生成的html正文。

編輯mysite/blog/views.py

from django.template import loader, Context
from django.http import HttpResponse

from models import BlogPost

def archive(request):
    posts = BlogPost.objects.all()  #從數據庫獲取全部的BlogPost對象
    t = loader.get_template("archive.html") #用loader從mysite/blog/templates/目錄下找出名爲archive.html的模板
    c = Context({'posts': posts})
    return HttpResponse(t.render(c))


上面的過程過於複雜,能夠用render_to_response()來簡化過程

from django.shortcuts import render_to_response
from django.http import HttpResponse
from models import BlogPost

def archive(request):
    posts = BlogPost.objects.all() 
    return render_to_response('archive.html', {'posts':posts})


4.6 添加url模式

上面在views.py中定義瞭如何響應請求。哪一個如何將一個請求路徑與view中的archive

對應呢?那就是在urls.py中指定了。

咱們打開mysite/urls.py,並做以下修改:

from django.conf.urls import patterns, include, url

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls)),
    url(r'^blog/', include('blog.urls'))   #這行是剛加的
)


在urlpatterns中添加url(r'^blog/', include('blog.urls')),說明凡是以blog/開頭的路徑都由 blog.urls 模塊中的 urlpatterns 進行分派。

如今咱們來建 blog/目錄下的 urls.py 文件

from django.conf.urls import patterns, url
from blog.views import *

urlpatterns = patterns('',
    url(r'^$', archive)
)

在blog/urls.py中指定,blog/下的全部請求者交給view.archive處理。

如此以來,從請求到響應就連成了一條完整的流程。

好!咱們來檢驗一下成果!訪問:http://127.0.0.1:8000/blog/


4.7 排序

雖然達到了最初的目的,可是順序最好是按時間倒序排列。

在 blog/models.py 中的 BlogPost 類中添加 Meta 內部類,用這個內部類指定排庫方式

class BlogPost(models.Model):
    timestamp = models.DateTimeField()
    # 略...
    class Meta:
        ordering = ('-timestamp',)


上面指定以timestamp進行逆排序。

這就對了嘛!


5. 示例代碼

上面的示例代碼已提交到git.oschina.net。路徑爲:

http://git.oschina.net/hevake_lcj/Django-Blog

供你們參考。


6. 總結

Django是一個MTV(模型、模板、視圖)的web設計架構。

當服務器運行起來以後,每接收到一個http請求,則經過urls.py中的模式匹配,找到對應的view來處理。

view找到對應的template並將models中的數據填充到template中生成html數據再返回給用戶。

與以前瞭解的CGIHTTPServer不一樣的是,CGIHTTPServer只是一個有CGI功能的HTTP服務器,只負責將HTTP請求指定到對應的cgi文件,它並無論cgi是怎麼實現一個頁面的。

而Django則是在wsgi的基礎上進一步對封裝。爲具體實現邏輯提供許多很是有用的工具,並提出一個頗有用的框架,它是服務器+架構。

相關文章
相關標籤/搜索