web-dev-qa-db-ja.com

Django / python: 'function'オブジェクトには 'as_view'属性がありません

モデルクエリセットのlist_viewを作成しようとしています。サーバーを実行すると、次のエラーが返されます:属性エラー-'function'オブジェクトに属性 'as_view'がありません。これを解決するのを手伝っていただければ幸いです。

これが私のコードです:

Views.py:

@login_required 
class live_bids(ListView):

    model = Post 
    template_name = 'loggedin_load/live_bids.html'

    def get_queryset(self):
        return Post.objects.all().prefetch_related('bids').filter(user=self.request.user)

urls.py:

 url(r'^live_bids/$', live_bids.as_view()),
13
sumanth

そのようなクラスではlogin_requiredデコレータを使用できません。 method_decoratorを使用する必要があります。 Django 1.9+では、クラスを装飾できます:

from Django.contrib.auth.decorators import login_required
from Django.utils.decorators import method_decorator

@method_decorator(login_required, name='dispatch')
class LiveBids(LoginRequiredMixin, ListView):
    ...

以前のバージョンでは、dispatchをオーバーライドし、そこでmethod_decoratorを使用する必要があります。

class LiveBids(LoginRequiredMixin, ListView):
    @method_decorator(login_required)
    def dispatch(self, *args, **kwargs):
        return super(LiveBids, self).dispatch(*args, **kwargs)

最も簡単な解決策は、デコレータの代わりに LoginRequiredMixin を使用することです(Django 1.9+で動作)

from Django.contrib.auth.mixins import LoginRequiredMixin

class LiveBids(LoginRequiredMixin, ListView):
    model = Post 
    template_name = 'loggedin_load/live_bids.html'

    def get_queryset(self):
        return Post.objects.all().prefetch_related('bids').filter(user=self.request.user)

例では、推奨されるDjangoスタイルに合わせて、ビューの名前をLiveBidsに変更しました。URLパターンも更新する必要があります。

27
Alasdair