<p>您似乎忽略了基于类的视图流的工作原理。</p>
<ul>
<li>因为基于类的视图显然是一个类,Django希望
未绑定函数(未附加到类或实例)作为视图,<code>as_view</code>通过创建未绑定函数来处理,并在该函数中实例化基于类的
查看。</li>
<li><code>as_view</code>然后调用<code>self.dispatch(request, *args, **kwargs)</code>,其中<code>self</code>是刚刚创建的实例化对象。</li>
<li><code>dispatch</code>调用<code>self.get(request, *args, **kwargs)</code>或<code>self.post(request, *args, **kwargs)</code>,这取决于请求方法(或者<code>put</code>、<code>patch</code>或<code>delete</code>(如果允许并使用这些方法)。</li>
</ul>
<p>对于像<code>clear</code>函数这样的自定义函数没有空间,除非重写其中一个方法来调用<code>self.clear(request)</code>。与<code>@api_view(['POST'])</code>等价的是重写<code>post(request, *args, **kwargs)</code>方法:</p>
<pre><code># views.py
class CartAPIView(APIView):
def post(self, request, *args, **kwargs):
# Why would you call this 'queryset'? It's a single object.
cart = Cart.objects.get(user=request.user)
cart.clear_cart()
serializer = CartSerializer(cart)
return Response(serializer.data, status=status.HTTP_200_OK)
# urls.py
urlpatterns = patterns('app.views',
url(r'^cart/clear/$', CartAPIView.as_view(), name='clear_cart_api'),
)
</code></pre>