Car*_*yer 42
我创建并使用了我自己的通用视图类,定义__call__了类的实例是可调用的.我很喜欢; 虽然Django的通用视图允许通过关键字参数进行一些自定义,但是OO泛型视图(如果它们的行为被分成许多单独的方法)可以通过子类化进行更细粒度的自定义,这让我重复自己的次数要少得多.(我厌倦了在需要调整Django的通用视图不太允许的东西的时候重写相同的创建/更新视图逻辑).
我在djangosnippets.org上发布了一些代码.
我看到的唯一真正的缺点是内部方法调用的激增,这可能会对性能产生一些影响.我不认为这是一个值得关注的问题; 很少有Python代码执行会成为Web应用程序中的性能瓶颈.
更新:Django自己的通用视图现在基于类.
更新:FWIW,我已经改变了我对基于类的视图的看法,因为这个答案是写的.在几个项目中广泛使用它们之后,我觉得它们往往会导致编写令人满意的DRY,但后来很难阅读和维护,因为功能分布在很多不同的地方,而且子类是如此依赖关于超类和mixins的每个实现细节.我现在觉得TemplateResponse和视图装饰器是分解视图代码的更好答案.
Eri*_*lik 13
我需要使用基于类的视图,但我希望能够在我的URLconf中使用该类的全名,而无需在使用之前实例化视图类.帮助我的是一个非常简单的元类:
class CallableViewClass(type):
def __call__(cls, *args, **kwargs):
if args and isinstance(args[0], HttpRequest):
instance = super(CallableViewClass, cls).__call__()
return instance.__call__(*args, **kwargs)
else:
instance = super(CallableViewClass, cls).__call__(*args, **kwargs)
return instance
class View(object):
__metaclass__ = CallableViewClass
def __call__(self, request, *args, **kwargs):
if hasattr(self, request.method):
handler = getattr(self, request.method)
if hasattr(handler, '__call__'):
return handler(request, *args, **kwargs)
return HttpResponseBadRequest('Method Not Allowed', status=405)
Run Code Online (Sandbox Code Playgroud)
我现在可以实例化视图类并将实例用作视图函数,或者我可以简单地将我的URLconf指向我的类并让metaclass为我实例化(并调用)视图类.这通过检查第一个参数来工作__call__- 如果它是a HttpRequest,它必须是一个实际的HTTP请求,因为用HttpRequest实例来实例化一个视图类是没有意义的.
class MyView(View):
def __init__(self, arg=None):
self.arg = arg
def GET(request):
return HttpResponse(self.arg or 'no args provided')
@login_required
class MyOtherView(View):
def POST(request):
pass
# And all the following work as expected.
urlpatterns = patterns(''
url(r'^myview1$', 'myapp.views.MyView', name='myview1'),
url(r'^myview2$', myapp.views.MyView, name='myview2'),
url(r'^myview3$', myapp.views.MyView('foobar'), name='myview3'),
url(r'^myotherview$', 'myapp.views.MyOtherView', name='otherview'),
)
Run Code Online (Sandbox Code Playgroud)
(我在http://djangosnippets.org/snippets/2041/上发了一个片段)
ros*_*ssp 10
如果您只是显示模型中的数据,为什么不使用Django Generic Views?它们旨在让您轻松地显示模型中的数据,而无需编写自己的视图以及将URL参数映射到视图,获取数据,处理边缘情况,渲染输出等内容.
| 归档时间: |
|
| 查看次数: |
13595 次 |
| 最近记录: |