2011-12-05 3 views
4

を使用してテンプレートにページの区切り:私は私のテンプレートタグで、しかし ページ= 1 sort_by =価格ジャンゴ - 私はDjangoのページネータを使用していますし、私のような複数の利用可能な取得パラメータ、持ちたい複数のGETパラメータ

Showing items sorted by {{ SORT_PARAM }}. 
Showing {{ ITEMS_PER_PAGE }} items per page. 

{% if has_prev %} 
<a href="?page={{ prev_page }}">Previous</a> | 
{% endif %} 

ただし、これは他のGET変数を保持しません。私は

page/?page=1&sort_by=price 

を見ていると私は、上記のテンプレートフラグメント内のリンクをクリックすると私は何を意味することは、ですが、私は

page=2 

代わりの

page=2&sort_by=price 

に行きます私は何つまり、hrefは他のGETパラメータを保持しません。

一つの解決策は、私は、このような

<a href="?page={{ prev_page }}&items_per_page={{ ITEMS_PER_PAGE }}&sort_param={{ SORT_PARAM }}">Previous</a> 

としてのhrefで可能なすべてのGETパラメータを入力することができているが、これは私が私のブラウジングに追加する複数の引数少ないスケーラブルになります。私は、すべてのGETパラメータを取得するための自動化された方法が必要であると推測しています。

+1

特別なtemplate_tagを作成しようとします。あなたが設定からいくつかのパラメータ(すなわち、ITEMS_PER_PAGE)を取るならば、それを明示的に渡す必要はありません) – yedpodtrzitko

+0

ありがとうございました。それはショットに値するかもしれない –

答えて

2

'パラメータ文字列'を作成できます。

options='P-S-D' #order by price, 5 items per page, descending order 

エンコードopions:あなたのようにオプションをconcatenatでき

my_view(request, page, options): 
    sort_choices = {P:'price',N:'name', ...} 
    n_item_choices = {'S':5, 'L':50, 'XL':100) 
    ascending_descending_choices = {'A':'', 'D':'-'} 
    ... 

:のはあなたのコードであなたが持っているsuposeましょうurls.pyキャプチャオプションで、その後

<a href="?page={{ prev_page }}&options={{ options }}">Previous</a> 

、および視野:

my_view(request, page, options): 
    ... #choides .... 
    try: 
     optionsArray = options.split('-') 
     sort_by = sort_choices[ optionsArray[0] ] 
     n_ites_page = n_item_choices[ optionsArray[1] ] 
     asc_or_desc = ascending_descending_choices[ optionsArray[2] ] 
     ... 
    except: 
     somebody is playing .... 

メソッドでurls.pyを変更せずにページオプションを自由に追加することができます。必要なのは、文字列オプションの最後にオプションを追加することだけです。これには利点がありますが、いくつかの危険性もあります。リスクを特定できることを願っています。

0

クリーナーに見える - のGETのparamsを維持することは簡単です。

まずコピー(ビュー)の変数にGETのparams:

GET_params = request.GET.copy() 

とコンテキスト辞書経由でテンプレートに送信:あなたがする必要がある

return render_to_response(template, 
         {'request': request, 'contact': contact, 'GET_params':GET_params}, context_instance=RequestContext(request)) 

第二のものが使用されますテンプレートのURL呼び出し(href)で指定します(追加のパラメータ条件を処理するために、基本的なページ付けHTMLを拡張しています)。

{% if contacts.has_next %} 
    {% if GET_params %} 
     <a href="?{{GET_params.urlencode}}&amp;page={{ contacts.next_page_number }}">next</a> 
    {% else %} 
     <a href="?page={{ contacts.next_page_number }}">next</a> 
    {% endif %} 
{% endif %} 

Source - 投稿された同じ回答。