自定义django class based view 的一个例子
By:Roy.LiuLast updated:2014-05-22
Django 从 1.3 版本开始进引入了 class based view 的方式,以这种方式处理视图,可以在一些基类中写一些公用方法。我查看 Django 相关文档,感觉有点麻烦。其实如果要将现有的基于 function 的 view 变成 class based view 应该是比较简单的。完全可以自定义个实现。虽然这不是 django 所要求的方式,但对我来说,这样的改动也许是最小的。举个例子
原来的处理方法如下,这是基于 function 的 view
url 的配置:
以上是传统的配置方式,如果要变成 class based view 最简单的方法是什么样的呢,就目前来说,我觉得如下方法或许是最简单的,改动也最小的. 总结为如下:
视图view class 的代码
同样 urls.py 的配置也要相应改变
在这样的配置之后,运行程序,可以看到如下界面,说明成功运行,并且找到各自的方法,而且改动并不大,只是将原来的方法放到一个类中就可以了。
测试程序代码下载:
customize django class based view sample code
原来的处理方法如下,这是基于 function 的 view
def index(self, request, *args, **kwargs): return render_to_response('index.html',{},context_instance=RequestContext(request)) def get(self, request, *args, **kwargs): print 'execute get methos' print kwargs context = {} return render_to_response('get.html',context,context_instance=RequestContext(request))
url 的配置:
urlpatterns = patterns('', url(r'^$', views.index), url(r'^restview/(?P\d{1,15}).html$',views.get ), url(r'^restview/head.html$',views.head ), )
以上是传统的配置方式,如果要变成 class based view 最简单的方法是什么样的呢,就目前来说,我觉得如下方法或许是最简单的,改动也最小的. 总结为如下:
视图view class 的代码
''' Created on 2014-5-22 @author: Administrator ''' from django import http from django.shortcuts import render_to_response from django.template.context import RequestContext class RestView(object): methods = ('GET', 'HEAD', 'INDEX') @classmethod def dispatch(cls, request, *args, **kwargs): print kwargs exec_method = kwargs.get('method','') resource = cls() if exec_method.lower() not in (method.lower() for method in resource.methods): return http.HttpResponseNotAllowed(resource.methods) try: method = getattr(resource, exec_method.lower()) except AttributeError: raise Exception("View method `%s` does not exist." % exec_method.lower()) if not callable(method): raise Exception("View method `%s` is not callable." % exec_method.lower()) return method(request, *args, **kwargs) def index(self, request, *args, **kwargs): return render_to_response('index.html',{},context_instance=RequestContext(request)) def get(self, request, *args, **kwargs): print 'execute get methos' print kwargs context = {} return render_to_response('get.html',context,context_instance=RequestContext(request)) def head(self, request, *args, **kwargs): print 'execute head method' response = self.get(request, *args, **kwargs) response.content = 'head method testing' return response
同样 urls.py 的配置也要相应改变
from django.conf.urls import patterns, include, url from views import RestView # Uncomment the next two lines to enable the admin: # from django.contrib import admin # admin.autodiscover() urlpatterns = patterns('', url(r'^$', RestView.dispatch, {"method":"index"}), url(r'^restview/(?P\d{1,15}).html$', RestView.dispatch, {"method":"get"} ), url(r'^restview/head.html$', RestView.dispatch, {"method":"head"} ), )
在这样的配置之后,运行程序,可以看到如下界面,说明成功运行,并且找到各自的方法,而且改动并不大,只是将原来的方法放到一个类中就可以了。
测试程序代码下载:
customize django class based view sample code
From:一号门
Previous:几张图了解django class base view 的响应流程
COMMENTS