2009-03-21 20 views
3

私はかなり簡単な質問があります。私は、Djangoサイトでいくつかの日付ベースの一般的なビューを作成したいと思いますが、それらのページを改ページしたいと思います。ドキュメンテーションによると、object_listビューにはpageとpaginate_byの引数がありますが、archive_monthビューにはありません。それを行う "正しい"方法は何ですか?Djangoの日付ベースの一般的なビューのページ設定

答えて

1

日付ベースのジェネリックビューには改ページがありません。レンダリングされた結果を返すので、それらをラッピングすることによってページネーションを追加することはできないようです。

この場合、自分のビューを作成するだけです。ジェネリックビューのコードもチェックアウトできますが、ほとんどの場合、おそらくあなたの場合は不要になるでしょう。

あなたの質問は有効なものであり、コードを見ているので、彼らがなぜクエリーセットの生成を別々の機能として切り離さなかったのだろうか。あなたはそれらを使用して、あなたが望むようにレンダリングすることができます。

+0

ええ、それは私が探しているものです。クエリーセットを生成する関数は、日付のパラメータに基づいています。私はそれを持っている場合、私はちょうどobject_listまたはページネーションオブジェクトを使用することができます。今のように、自分の意見を書く必要があると思う。 – Apreche

+0

私はdjangoのジェネリックビュー自身に不満を抱きました。そして、基本的には、ジェネリックビューファクトリタイプのgodメソッドを書いていますので、ここで述べた制限はありません。 – SingleNegationElimination

3

まだページ付けされていないテンプレートに渡されたコレクションに対してテンプレートベースのページ付けを行うテンプレートタグを作成しました。次のコードをapp/templatetags/pagify.pyファイルにコピーします。

from django.template import Library, Node, Variable 
from django.core.paginator import Paginator 
import settings 

register = Library() 

class PagifyNode(Node): 
    def __init__(self, items, page_size, varname): 
     self.items = Variable(items) 
     self.page_size = int(page_size) 
     self.varname = varname 

    def render(self, context): 
     pages = Paginator(self.items.resolve(context), self.page_size) 
     request = context['request'] 
     page_num = int(request.GET.get('page', 1)) 

     context[self.varname] = pages.page(page_num) 
     return '' 

@register.tag 
def pagify(parser, token): 
    """ 
    Usage: 

    {% pagify items by page_size as varname %} 
    """ 

    bits = token.contents.split() 
    if len(bits) != 6: 
     raise TemplateSyntaxError, 'pagify tag takes exactly 5 arguments' 
    if bits[2] != 'by': 
     raise TemplateSyntaxError, 'second argument to pagify tag must be "by"' 
    if bits[4] != 'as': 
     raise TemplateSyntaxError, 'fourth argument to pagify tag must be "as"' 
    return PagifyNode(bits[1], bits[3], bits[5]) 

テンプレート(私たちはアイテムと呼ばれる非ページ分割リストに渡されてきたと仮定)でそれを使用するには:PAGE_SIZE引数(20)のように、可変することができ

{% load pagify %} 

{% pagify items by 20 as page %} 
{% for item in page %} 
    {{ item }} 
{% endfor %} 

よくタグはクエリ文字列内の変数page=5を自動的に検出します。私はこの昨日と同様の問題に取り組んでいた

{{ page.paginator.num_pages }} 
1

を、そしてI:あなたが今まで(例えば、ページ数のため)ページに属しているページネータで取得する必要がある場合と、あなたは簡単に呼び出すことができます私のために最善の解決策を見つけ、次のように個人的に、すべての日付ベースのページのためのOBJECT_LIST汎用ビューを使用しますが、フィルタクエリセットを渡すことだった:

url(r'^blog/(?P<year>\d{4})/(?P<month>\w{3})/$', 
    view=path.to.generic_view, 
    name='archive_month'), 
:urls.pyのようなものを読み

import datetime, time 

def post_archive_month(request, year, month, page=0, template_name='post_archive_month.html', **kwargs): 
    # Convert date to numeric format 
    date = datetime.date(*time.strptime('%s-%s' % (year, month), '%Y-%b')[:3]) 
    return list_detail.object_list(
     request, 
     queryset = Post.objects.filter(publish__year=date.year, publish__date.month).order_by('-publish',), 
     paginate_by = 5, 
     page = page, 
     template_name = template_name, 
     **kwargs) 

これは、他の一般的なビューをハッキングしたり、カスタムビューを作成したりせずに、この問題を回避する最も簡単な方法でした。

+0

+1日付に基づくビューが通過する追加の変数(年、月など)を補うためにextra_contextに追加情報を追加する必要がありますが、 – Soviut

0

Djangoの日付ベースのジェネリックビューは、ページネーションをサポートしていません。これにはopen ticket from 2006があります。必要に応じて、この機能を実装するために提供されたコードパッチを試すことができます。なぜパッチがまだコードベースに適用されていないのかわかりません。

1

優れたdjango-paginationアドオンもあります。これは、基本となるビューから完全に独立しています。

関連する問題