【问题标题】:Django/python: 'function' object has no attribute 'as_view'Django/python:'function'对象没有属性'as_view'
【发布时间】:2016-12-08 00:59:42
【问题描述】:

我正在尝试为模型查询集创建一个 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()),

【问题讨论】:

    标签: django django-views django-urls django-generic-views


    【解决方案1】:

    你不能在这样的类上使用 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)
    

    请注意,在示例中,我已将视图重命名为 LiveBids,以匹配推荐的 Django 样式。您还必须更新 url 模式。

    【讨论】:

    • 烧瓶有没有办法做到这一点?
    • @JohnSmith 这个问题与烧瓶无关。请提出一个新问题。
    • 这非常有用!谢谢@Alasdair
    猜你喜欢
    • 2021-01-12
    • 2016-03-17
    • 2021-04-24
    • 2022-06-13
    • 2011-10-13
    • 2017-07-07
    • 2018-05-07
    • 2020-11-13
    • 2021-10-22
    相关资源
    最近更新 更多