为了账号安全,请及时绑定邮箱和手机立即绑定

Django中的类视图

Django中的类视图

慕容3067478 2021-03-22 10:12:33
Django视图指向一个函数,如果您只想更改一些功能,则可能会出现问题。是的,函数中可以有数百万个关键字参数,如果有语句,甚至可以更多,但是我在想更多的面向对象方法。例如,我有一个显示用户的页面。该页面与显示组的页面非常相似,但仍与仅使用另一个数据模型不太相似。小组也有成员等...一种方法是将视图指向类方法,然后扩展该类。有没有人尝试过这种方法或有其他想法?
查看完整描述

3 回答

?
慕工程0101907

TA贡献1887条经验 获得超5个赞

我需要使用基于类的视图,但是我希望能够在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 instanceclass 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)

现在,我既可以实例化视图类,也可以将实例用作视图函数,或者我可以简单地将URLconf指向我的类,并让元类为我实例化(并调用)视图类。这是通过检查第一个参数__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_requiredclass 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'),)


查看完整回答
反对 回复 2021-03-22
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

如果您只是显示模型中的数据,为什么不使用Django Generic Views?它们的设计使您可以轻松显示模型中的数据,而无需编写自己的视图以及将URL参数映射到视图,获取数据,处理边缘情况,呈现输出等方面的知识。


查看完整回答
反对 回复 2021-03-22
  • 3 回答
  • 0 关注
  • 263 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信