我是邊看Django相關文檔邊整理的這篇博客,至關於學習筆記,寫的有點亂,若是你已經瞭解Django開發,就不用看了,不過這裏仍是涉及到了一點Django的設計思路,對理解Django仍是有些好處的,文後有Django中英文檔連接。html
本質上來講, Django 只不過是用 Python 編寫的一組類庫。 用 Django 開發站點就是使用這些類庫編寫 Python 代碼。 所以,學習 Django 的關鍵就是學習如何進行 Python 編程並理解 Django 類庫的運做方式。 ##環境準備## Django的安裝請直接官方文檔Django 安裝章節 很容易懂,很少說了,若是搞不定推薦看看這篇博客python
執行命令建立Django項目的骨架web
django-admin.py startproject mysit
建立的Django項目目錄結構以下正則表達式
mysite/ __init__.py manage.py settings.py urls.py
啓動服務sql
python manage.py runserver
控制檯打印以下信息:shell
Validating models... 0 errors found March 18, 2014 - 10:42:35 Django version 1.6.2, using settings 'mysite.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK.
此時已經啓動web服務,默認端口號爲8000數據庫
瀏覽器訪問 http://127.0.0.1:8000/ 展現出Django的歡迎 界面,就是這麼簡單django
代碼編寫,建議您使用python自帶的IDLE編輯器編程
編寫視圖(你會注意到Django的視圖概念相似咱們常說的MVC裏的控制器C,概念稍有不一樣,後面會解釋)瀏覽器
新建views.py,代碼入下
from django.http import HttpResponse def hello(request): return HttpResponse('Hello world')
綁定視圖
編輯urls.py(這個文件是框架生成的,在mysite目錄下,爲url映射文件)新增一行代碼url('^hello/$', hello),
後以下
from django.conf.urls import patterns, include, url from django.contrib import admin from mysite.views import hello admin.autodiscover() urlpatterns = patterns('', # Examples: # url(r'^$', 'mysite.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), # 這一行爲新增,將url xxx/hello/ 映射到方法視圖的函數 hello url('^hello/$', hello), )
瀏覽器訪問 http://127.0.0.1:8000/hello 會展現你的Hello World
編寫視圖 修改views.py,代碼以下
from django.http import HttpResponse import datetime def hello(request): return HttpResponse('Hello world') def datetime_now(request): now=datetime.datetime.now() html="<html><body>It is now %s.</body></html>" % now return HttpResponse(html)
修改視圖
修改urls.py 相似上面新增一行映射代碼 url(r'^nowtime/$', datetime_now),
瀏覽器訪問 http://127.0.0.1:8000/nowtime 會展現當前時間在網頁上
經過兩個例子,已經能夠看到,視圖的函數老是接收一個request參數而且返回一個HttpResponse
在這個例子中,看一下動態ur的處理,好比下面這種,你總不能每一個都url都靜態綁定進去,這裏要用到正則表達式
,咱們在例子中展現幾個小時候的時間,給一個兩位整數的小時偏移量
book/1
book/2
book/222
編輯視圖
修改views.py,代碼以下
from django.http import HttpResponse , Http404 import datetime #...省略部分代碼... def hours_ahead(request, offset): try: offset = int(offset) except ValueError: raise Http404() dt = datetime.datetime.now() + datetime.timedelta(hours=offset) html = "<html><body>In %s hour(s), it will be %s.</body></html>" % (offset, dt) return HttpResponse(html)
綁定視圖
修改urls.py,繼續增長一行映射代碼url(r'^nowtime/plus/(\d{1,2})/$', hours_ahead),
注意用圓括號把 \d{1,2} 包圍起來:
瀏覽器訪問
http://127.0.0.1:8000/nowtime/plus/2
http://127.0.0.1:8000/nowtime/plus/22
http://127.0.0.1:8000/nowtime/plus/7
如上例子中的,html代碼是寫在python代碼中的,下面介紹Django的模板技術,解決這種緊耦合,解耦網頁設計和python代碼,下面使用模板技術重寫第二個例子
寫模板
在mysite下新建文件夾templates用於存放全部模板,新建datetime_now.html
,內容以下
<html><body>It is now {{ datetime_now }}.</body></html>
修改視圖
from django.http import HttpResponse , Http404 from django.template import Template , Context from django.template.loader import get_template import datetime #...省略部分代碼... def datetime_now(request): now=datetime.datetime.now() #使用loader加載模板,建立Template對象 t=get_template('datetime_now.html') #建立Context對象,調用render()方法 html=t.render(Context({'datetime_now':now})) return HttpResponse(html)
另外還須要配置模板的路徑,修改settings.py 增長以下,其中BASE_DIR是已有代碼
#這行會是已經有的代碼 BASE_DIR = os.path.dirname(os.path.dirname(__file__)) #下面的爲新增代碼 TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'templates').replace('\\','/'), )
一樣,瀏覽器訪問 http://127.0.0.1:8000/nowtime 會展現當前時間在網頁上
##數據模型層##
首先,Django對數據模型層的支持真心不錯,下面例子選擇內置的sqlite3做爲數據庫,由於簡單
數據庫的配置在settings.py裏,sqlite的配置最簡單,以下
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
由於Django默認約束若是使用到數據庫(模型層)必需要建立app,實際上也是這樣,通常一個 project包含多個app
下面建立一個app,名字爲polls
python manage.py startapp polls
建立後的目錄結構以下
polls/ __init__.py models.py tests.py views.py
編輯models.py 定義模型
from django.db import models from django.utils import timezone import datetime # Create your models here. class Poll(models.Model): question = models.CharField(max_length=200) pub_date = models.DateTimeField('date published') class Choice(models.Model): poll = models.ForeignKey(Poll) choice_text = models.CharField(max_length=200) votes = models.IntegerField(default=0)
你能夠看出,上面定義了Poll 和 Choice兩個實體,一對多關係,每一個字段的名字,長度,類型 都是和數據庫表對應起來的
編輯 settings.py 文件,激活你的app
INSTALLED_APPS = ( 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'polls', )
檢查模型有效性
python manage.py validate
查看數據庫語句
python manage.py sqlall polls
你將會看到生成的建表語句,表名字段名等生成規則是能夠自定義的
上面只是瀏覽,下面這條語句會真正執行建立表的動做
python manage.py syncdb
如你所見,表已經建立好了
啓動shell
python manage.py shell
下面,執行下面的語句熟悉下django提供的數據操做API吧
>>> from polls.models import Poll, Choice # 引入類 # 返回空的列表,由於尚未插入數據 >>> Poll.objects.all() [] #建立一個Poll,使用django的timezone模塊 >>> from django.utils import timezone >>> p = Poll(question="What's new?", pub_date=timezone.now()) # 保存到數據庫 >>> p.save() #id是自動生成的 >>> p.id 1 # 經過屬性訪問數據庫字段 >>> p.question "What's new?" >>> p.pub_date datetime.datetime(2012, 2, 26, 13, 0, 0, 775217, tzinfo=<UTC>) # 改變屬性並保存 >>> p.question = "What's up?" >>> p.save() # 顯示數據庫的全部Poll,這裏由於沒有寫__str__()方法(python2.x是__unicode())因此顯示成這樣,相似於Java的toString >>> Poll.objects.all() [<Poll: Poll object>]
###至此就差很少了,我去繼續熟悉python和django的API了###
Django 的設計遵循MVC
Django中 C 由框架自行處理,而 Django 裏更關注的是模型(Model)、模板(Template)和視圖(Views),Django 也被稱爲 MTV 框架 。在 MTV 開發模式中:
M 表明模型(Model),即數據存取層。與傳統 MVC 的 M 概念一致
T 表明模板(Template),即表現層。至關於 MVC 中的 V, 類比JSP,Velocity和Freemarker
V 表明視圖(View),即業務邏輯層。至關於 MVC 中的 C,類比Spring的Controller或Struts的Action
MVC仍是MTV,只是概念問題
Django官方文檔英文還能夠的話固然建議看這個
Django中文手冊(比較舊)