在学习Django视图策略的时候,使用基于类的视图 (CBV),遇到了一个问题:
re_path(r'^new_post/$', views.NewPostView.as_view(), name='new_post'),
AttributeError: 'function' object has no attribute 'as_view'
先简单介绍一下CBV:
基于类的视图 (CBV)
CBV是View类的集成类。这里的主要区别在于请求是以HTTP方法命名的类方法内处理的,例如GET,POST,PUT,HEAD等。
所以,在这里,我们不需要做一个条件来判断请求是一个POST还是它是一个GET。代码会直接跳转到正确的方法中。在View类中内部处理了这个逻辑。
我的视图如下:
url:
re_path(r'^new_post/$', views.NewPostView.as_view(), name='new_post'),
最终在Stack Overflow上找到了答案,在这个类上不能使用@login_required这个装饰器,而需要使用method_decorator,并传递一个装饰器(或一个装饰器列表)并告诉应该装饰哪个类。在 CBV 中,装饰调度类是很常见的。它是一个Django内部使用的方法(在View类中定义)。所有的请求都会经过这个类,所以装饰它会相对安全。如下,注意导入模块from django.utils.decoratorsimport method_decorator:
这样问题就解决了,这里贴上Stack Overflow原回答链接:Django/python: 'function' object has no attribute 'as_view' - Stack Overflow