Django簡單應用
前面簡單示例說明了views和Template的工作過程,但是Django最核心的是App,涉及到App則會和Model(數據庫)打交道。下面舉的例子是創建一個簡單應用wiki App。
- 首先在命令行下創建app:
此時,mysite下會多出一個目錄wiki,wiki/下面有四個文件:
__init__.py:表示wiki目錄是一個包,可以被其它App導入 models.py:用來存放Model代碼,描述數據庫結構和數據接口
tests.py:演示兩種風格的測試代碼,用於Django App的調試
views.py:用來存放view代碼,處理URL請求的Views方法
- 修改wiki/models.py,創建數據模型:
from django.db import models # Create your models here. class Wiki(models.Model): pagename = models.CharField(max_length=20, unique=True) content = models.TextField()
這里Wiki是model的名字,它是models.Model的子類,它的兩個屬性分別是models.CharField和models.TextField的實例。pagename用來保存頁面的名字,最大長度為20個字符,且不能重復;content用來保存頁面內容。
安裝wiki app,每個app創建后都需要手動安裝
- 修改settings.py,安裝app:
在settings.py中找到“INSTALLED_APPS”,修改為:
INSTALLED_APPS = ( 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.sites', 'django.contrib.messages', 'django.contrib.staticfiles', # Uncomment the next line to enable the admin: # 'django.contrib.admin', # Uncomment the next line to enable admin documentation: # 'django.contrib.admindocs', 'wiki', <==加入此句 )
- 初始化數據庫:
這一步是根據wiki/models.py在數據庫中創建相應的表。執行manage.py syncdb來同步數據庫。在這之前要決定使用何種數據庫,並且在settings.py中配置相關數據庫項。僅為入門,so,我使用的是python2.5+自帶的文件數據庫sqlite3(需要建一個db文件,如mysite.db),使用自帶的sqlite3的話,只需寫ENGINE和NAME參數即可。
-
- 修改settings.py文件,配置數據庫參數:
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'. 'NAME': 'C:/Python27/Scripts/mysite/mysite.db', # Or path to database file if using sqlite3. 'USER': '', # Not used with sqlite3. 'PASSWORD': '', # Not used with sqlite3. 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. 'PORT': '', # Set to empty string for default. Not used with sqlite3. } }
-
- 同步數據庫,此步驟會創建models中定義的表(包括系統的和自定義的):
第一次會創建會要求創建一個超級用戶賬號,manage.py syncdb命令可以多次運行,不會重復創建表。
先不急下面的操作,先來驗證我們的數據庫可否操作。創建好表后,進入python環境,來進行一些簡單的數據庫操作
- 運行manage.py shell進入python環境進行相關數據庫測試:
使用命令行來創建一個名為FrontPage的首頁
- 修改wiki/views.py,添加edit和save函數:

#-*- coding:utf-8 -*- # Create your views here. from django.http import HttpResponse,HttpResponseRedirect from django.shortcuts import render_to_response from django.template import loader,Context from models import Wiki def index(request,pagename=''): '''顯示一半頁面,對頁面內容做鏈接處理''' if pagename: #如果提供了頁面的名字,則查找頁面是否已經存在 pages = Wiki.objects.filter(pagename=pagename) if pages: #如果頁面已存在,則調用模板來顯示 return process('wiki/page.html', pages[0]) else: #如果頁面不存在,則進入編輯界面 return render_to_response('wiki/edit.html', {'pagename':pagename}) else: #如果沒有提供頁面的名字,則顯示首頁 page = Wiki.objects.get(pagename='FrontPage') return process('wiki/page.html', page) def edit(request, pagename): '''顯示編輯頁面''' page = Wiki.objects.get(pagename=pagename) return render_to_response('wiki/edit.html', {'pagename':pagename, 'content':page.content}) def save(request, pagename): '''保存頁面內容並轉到更新后的頁面,如果頁面已存在則更新它的內容, 如果頁面不存在,則新建這個頁面''' content = request.POST['content'] pages = Wiki.objects.filter(pagename=pagename) if pages: pages[0].content = content pages[0].save() else: page = Wiki(pagename=pagename, content=content) page.save() return HttpResponseRedirect('/wiki/%s' % pagename) import re r = re.compile(r'\b(([A-Z]+[a-z]+){2,})\b') def process(template, page): '''處理頁面鏈接,並將換行符轉換為</br>''' t = loader.get_template(template) content = r.sub(r'<a href="/wiki/\1">\1</a>', page.content) content = re.sub(r'[\n\r]+', '<br/>', content) c = Context({'pagename':page.pagename, 'content':content}) return HttpResponse(t.render(c))
- 在templates目錄下單獨為wiki建立一個目錄,用來存放相關wiki的template,並且在settings.py的TEMPLATE_DIR中再加入一條模板文件的路徑:
TEMPLATE_DIRS = ( 'C:/Python27/Scripts/mysite/templates', 'C:/Python27/Scripts/mysite/templates/wiki', <==添加此句 # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths. )
-
- 創建文件:templates/wiki/page.html
<h2>{{ pagename }}</h2> <p>{{ content|safe }}</p> <hr> <p><form method="post" action="/wiki/{{ pagename }}/edit/"> <input type="submit" value="編輯"> </form></p>
-
- 創建文件:templates/wiki/edit.html
<h2>編輯:{{ pagename }}</h2> <form method="post" action="/wiki/{{ pagename }}/save/"> <textarea name="content" rows="10" cols="50">{{ content }}</textarea><br/> <input type="submit" value="保存"> </form>
- 修改urls.py,綁定相關views的函數:
可以這么寫:
urlpatterns = patterns('', url(r'^$',hello), url(r'^add/$',add), url(r'^list/$',addressbook), url(r'csv/(?P<filename>\w+)/$',output), url(r'^login/$',login), url(r'^logout/$',logout), url(r'^wiki/$',index), url(r'^wiki/(?P<pagename>\w+)/$','wiki.views.index'), url(r'^wiki/(?P<pagename>\w+)/edit/$','wiki.views.edit'), url(r'^wiki/(?P<pagename>\w+)/save/$','wiki.views.save'), )
當時這樣url的第二個參數顯得比較冗余,可以做如下改進:
urlpatterns = patterns('', url(r'^$',hello), url(r'^add/$',add), url(r'^list/$',addressbook), url(r'csv/(?P<filename>\w+)/$',output), url(r'^login/$',login), url(r'^logout/$',logout), ) urlpatterns+=patterns('wiki.views', url(r'^wiki/$','index'), url(r'^wiki/(?P<pagename>\w+)/$','index'), url(r'^wiki/(?P<pagename>\w+)/edit/$','edit'), url(r'^wiki/(?P<pagename>\w+)/save/$','save'), )
差不多了,可以啟動web服務了,啟動服務之前,先看下目錄結構吧~~~:
- 啟動web服務(python manage.py runserver 1234):
點擊“編輯”,如下:
至此,Django的MTV演示完畢,但是更復雜的東西有待挖掘。回眸一望,它的流程是:添加views方法——>添加模板——>修改settings.py——>修改urls.py