Django學習之通用視圖(generic views)


Django的通用視圖可以減少開發的單調性,它抽象出一些在視圖開發中常用的代碼和模式,這樣就可以在無需編寫大量代碼的情況下,快速編寫出常用的視圖函數。下面將使用通用視圖重寫前面所寫的代碼。要使用通用視圖,我們需要做幾件事:

  1. 修改URLconf
  2. 編寫基於通用視圖的視圖函數

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模板。

好了,通用視圖配置完畢。


免責聲明!

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



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