Django的通用視圖可以減少開發的單調性,它抽象出一些在視圖開發中常用的代碼和模式,這樣就可以在無需編寫大量代碼的情況下,快速編寫出常用的視圖函數。下面將使用通用視圖重寫前面所寫的代碼。要使用通用視圖,我們需要做幾件事:
- 修改URLconf
- 編寫基於通用視圖的視圖函數
1、修改URLconf
from django.conf.urls import patterns,url from blog.views import * urlpatterns = patterns('', url(r'^$',IndexView.as_view(),name='index'), url(r'^edit/$',edit,name='edit'), url(r'^(?P<pk>\d+)/$',DetailView.as_view(),name='detail'), //此處將id變成了pk )
2、修改視圖
from django.shortcuts import render,get_object_or_404,redirect from blog.models import Blog,PostForm from django.views import generic import datetime class IndexView(generic.ListView): template_name='blog/index.html' context_object_name='blogs' def get_queryset(self): return Blog.objects.all() class DetailView(generic.DetailView): model=Blog template_name='blog/detail.html' def edit(request): if request.method=='POST': form=PostForm(request.POST) if form.is_valid(): post=form.save(commit=False) post.user=request.user post.created_time=datetime.datetime.now() post.published_time=datetime.datetime.now() post.save() return render(request,'blog/detail.html',{'blog':post}) else: form=PostForm() return render(request,'blog/edit.html',{'form':form})
我們使用了兩個通用視圖:ListView和DetailView
ListView:顯示對象列表
DetailView:顯示一個對象的某個屬性詳細信息
如果在通用視圖函數中,我們不指定template_name,那么Django將會默認尋找<app name>/<model name>_detail.html和<app name>/<model name>_list.html模板。
好了,通用視圖配置完畢。