0

私は標準投票アプリを改善しています。

そこには、多くのビューで繰り返す必要があるコードがいくつかあります。次のような、リンクに数を投稿するためのさまざまな投票 (アクティブ、非アクティブ、人気) の数をカウントするコード:

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
        })

開発サーバーで投票インデックス ページを開こうとすると、次のエラーが表示されます。

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

1の引数が何であるかわかりません。問題はどこだ?

4

1 に答える 1

4

引数は、ビューへの引数ですrequest。関数でその引数を受け入れてcount()、に渡す必要がありfuncます。

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

ただし、要素をテンプレート コンテキストに渡すためにまだビュー自体に依存しているため、これはあまり良い方法ではありません。より良い代替手段として、コンテキスト プロセッサテンプレート タグを検討する必要があります。

于 2013-10-01T15:16:13.820 に答える