Django的。装饰者问题。

时间:2013-10-01 15:12:34

标签: python django

我正在改进标准民意调查应用程序。

我有一些代码需要在许多视图中重复:代码计算在链接中发布数字的各种民意调查(活动,非活动,流行)的数量,例如:

  

1)查看所有活跃的民意调查(民意调查数量)    2)查看所有已结算的民意调查   (民意调查数量)。

     

事实上,我需要多次重复这段代码,我决定做一个装饰师:

def count_number_of_various_polls(func):
    def count():
        # Count the number of active polls.
        all_active_polls = Poll.active.all()
        num_of_active_polls = len(all_active_polls)
        # Count the number of inactive polls.
        all_inactive_polls = Poll.inactive.all()
        num_of_inactive_polls = len(all_inactive_polls)
        # Count the number of popular polls per the last month.
        popular_polls = Poll.popular.filter(pub_date__gte=timezone.now() 
                                    - datetime.timedelta(days=days_in_curr_month))
        num_of_popular_polls = len(popular_polls)
        func()
    return count

然后我想装饰我的index视图:

@count_number_of_various_polls
def index(request): 
    latest_poll_list = Poll.active.all()[:5]
    return render(request, 'polls/index.html', {
        'latest_poll_list': latest_poll_list,
        'num_of_popular_polls': num_of_popular_polls,
        'num_of_active_polls': num_of_active_polls,
        'num_of_inactive_polls': num_of_inactive_polls
        })

当我尝试在我的开发服务器上打开polls索引页面时,我收到以下错误:

TypeError at /polls/
count() takes no arguments (1 given)

我不知道1的论点是什么。 问题在哪里?

1 个答案:

答案 0 :(得分:4)

参数是视图的参数,即request。您需要在count()函数中接受该参数,并将其传递到func

def count_number_of_various_polls(func):
    def count(request):
        ...
        func(request)
    return count

然而,这并不是一个非常好的方法,因为您仍然依赖视图本身将元素传递到模板上下文中。您应该将context processorstemplate tags视为更好的替代方案。