在上一節用一個插件生成了類似rails的scaffold,其實無非就是URLconf+MTV。讓我們看看具體都生成了哪些東西。
首先是“入口”的定義即URLconf,打開urls.py:
from django.conf.urls.defaults import patterns, include, url from depot.views import hello urlpatterns = patterns('', url(r'^hello/ hello), ) urlpatterns += patterns ('', (r'^depotapp/', include('depotapp.urls')), )
上面的代碼中增加的配置行表示:以depotapp開頭的url由depotapp/urls.py文件進行處理。
django的url配置中,除了(正則表達式,view函數)的方式外,還支持(正則表達式,include文件)的方式。通常把app自身相關的url寫到自己的url配置文件中,然后在project中引用。
接下來看一下生成的depotapp/urls.py的內容:
from django.conf.urls.defaults import * from models import * from views import * urlpatterns = patterns('', (r'product/create/$', create_product), (r'product/list/$', list_product ), (r'product/edit/(?P[^/]+)/$', edit_product), (r'product/view/(?P[^/]+)/$', view_product), )
將CRU(沒有D)的URL映射到了視圖。而視圖在depotapp/views.py中定義:
from django import forms from django.template import RequestContext from django.http import HttpResponse, HttpResponseRedirect from django.template.loader import get_template from django.core.paginator import Paginator from django.core.urlresolvers import reverse # app specific files from models import * from forms import * def create_product(request): form = ProductForm(request.POST or None) if form.is_valid(): form.save() form = ProductForm() t = get_template('depotapp/create_product.html') c = RequestContext(request,locals()) return HttpResponse(t.render(c)) def list_product(request): list_items = Product.objects.all() paginator = Paginator(list_items ,10) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: list_items = paginator.page(page) except : list_items = paginator.page(paginator.num_pages) t = get_template('depotapp/list_product.html') c = RequestContext(request,locals()) return HttpResponse(t.render(c)) def view_product(request, id): product_instance = Product.objects.get(id = id) t=get_template('depotapp/view_product.html') c=RequestContext(request,locals()) return HttpResponse(t.render(c)) def edit_product(request, id): product_instance = Product.objects.get(id=id) form = ProductForm(request.POST or None, instance = product_instance) if form.is_valid(): form.save() t=get_template('depotapp/edit_product.html') c=RequestContext(request,locals()) return HttpResponse(t.render(c))
視圖中的相關內容比較多,主要的是模板,其次還有模型類、Paginator分頁器、Form表單等等。
基本涵蓋了典型的web應用交互的內容。