下載源碼文件: Django-1.6.10.tar.gz
解壓後生成目錄:Django-1.6.10
進入目錄
html
$ sudo python setup.py install
就完成安裝了。
python
執行: django-admin.py startproject <工程名>
完成後會在當前目錄下生成<工程名>,好比mysite,的目錄。在該目錄下會有:
mysql
. |-- manage.py `-- mysite |-- __init__.py |-- settings.py |-- urls.py `-- wsgi.py
其中manage.py管理工具,以後的管理工做都是經過它來完成。git
$ ./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
$ ./manage.py startapp <應用名>
應用名能夠隨便取,但要符合python標識符的命名規範。好比:blogshell
在建立以後,在當前目錄(manager.py所在目錄)下生成blog目錄。內容以下:
數據庫
. |-- admin.py |-- __init__.py |-- models.py |-- tests.py |-- urls.py #python3沒有,能夠本身建 `-- views.py
編輯mysite/settings.pydjango
在INSTALLED_APPS中加入blog
瀏覽器
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', ...(略) 'blog' )
還要配置數據庫,告訴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,那就用默認的吧。
在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)
在定義了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不是其必須的模塊,可是它是管理網站頗有用的工具。
可是,上面這麼作還不能很好在地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/
在 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文件。
在例子中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})
上面在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/
雖然達到了最初的目的,可是順序最好是按時間倒序排列。
在 blog/models.py 中的 BlogPost 類中添加 Meta 內部類,用這個內部類指定排庫方式
class BlogPost(models.Model): timestamp = models.DateTimeField() # 略... class Meta: ordering = ('-timestamp',)
上面指定以timestamp進行逆排序。
這就對了嘛!
上面的示例代碼已提交到git.oschina.net。路徑爲:
http://git.oschina.net/hevake_lcj/Django-Blog
供你們參考。
Django是一個MTV(模型、模板、視圖)的web設計架構。
當服務器運行起來以後,每接收到一個http請求,則經過urls.py中的模式匹配,找到對應的view來處理。
view找到對應的template並將models中的數據填充到template中生成html數據再返回給用戶。
與以前瞭解的CGIHTTPServer不一樣的是,CGIHTTPServer只是一個有CGI功能的HTTP服務器,只負責將HTTP請求指定到對應的cgi文件,它並無論cgi是怎麼實現一個頁面的。
而Django則是在wsgi的基礎上進一步對封裝。爲具體實現邏輯提供許多很是有用的工具,並提出一個頗有用的框架,它是服務器+架構。