Django入門實踐(三)


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))
View Code
  • 在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

 

 

 


免責聲明!

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



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