1

djangoのジェネリックobject_list関数のページ付けが、私の巧妙さを補うのに十分なほど「スマート」ではないという問題があります。

ページ番号とカテゴリのオプションの引数を使用して、リストのURLを作成しようとしています。urls.pyのURLは次のようになります。

url(r'^all/(?:(?P<category>[-\w]+)/page-(?P<urlpage>\d+))?/$', views.listing, ),

カテゴリとurlpageの引数は、余分な「(?:)?」があるため、オプションです。それらの周りとそれはうまく機能します。views.listingは、次のようなラッパー関数です(これが私の問題が発生する場所ではないと思います):

def listing(request,category="a-z",urlpage="1"):
extra_context_dict={}
if category=="a-z":
    catqueryset=models.UserProfile.objects.all().order_by('user__username')
elif category=="z-a":
    catqueryset=models.UserProfile.objects.all().order_by(-'user__username')
else:
    extra_context_dict['error_message']='Unfortunately a sorting error occurred, content is listed in alphabetical order'
    catqueryset=models.UserProfile.objects.all().order_by('user__username')
return object_list(
                    request,
                    queryset=catqueryset,
                    template_name='userlist.html',
                    page=urlpage,
                    paginate_by=10,
                    extra_context=extra_context_dict,
                    )

私のテンプレートuserlist.htmlには、次のようなリンクがあります(これが本当の問題だと思います):

{%if has_next%}
  <a href=page-{{next}}>Next Page> ({{next}})</a>
{%else%}

私のURLのページ引数を置き換える代わりに、リンクはURLに別のページ引数を追加します。URLは「/all/ az / page-1 / page-2/ 」のようになります。

これが起こるのはそれほど驚くことではありませんが、オプションの引数としてページがないことは実際に機能し、DjangoがURLの一部である古いページを置き換えます。

私はこのDRYer(少なくとも私はそう思う)ソリューションを好みますが、それを機能させることができないようです。より良いurls.pyまたはテンプレートタグでこれを解決するためのヒントをいただければ幸いです。

(また、非ネイティブの英語とその場で翻訳されたコードを許してください。これが良いか、または不当なスタックオーバーフローの質問であるかどうかに関するフィードバックも喜んで受けます)

4

3 に答える 3

1

ここでは相対 URL を使用しているため、Django とはまったく関係ありません。リンクを次のものに置き換えることができます。

<a href="/all/a-z/page-{{ next }}">Next Page> ({{ next }})</a>

テンプレートに脆弱なリンクがあり、 を変更するとすぐに壊れてしまいurls.pycategoryたまたまa-z.

代わりに、Django の組み込みurlタグを使用してください。

<a href="{% url views.listing category next %}">Next Page> ({{ next }})</a>

extra_context_dictこれを機能させるには、ビュー コードの最初の行で作成する にカテゴリを渡す必要があります。

extra_context_dict = { 'category': category }
于 2010-10-08T15:35:19.963 に答える
0

ソースに表示されているものです/all/a-z/page-1/page-2/か、それともリンク先の場所ですか? 私の推測では、文字列「page-2」がブラウザによって現在の URL に追加されていると思われます。/フル パスを記述するには、URL で開始する必要があります。

おそらくカテゴリをに追加して、次のようにする必要がextra_contextあります。

 <a href="/all/{{category}}/page-{{next}}">next page ({{next}})</a>
于 2010-10-08T15:37:00.227 に答える
0

「私のURLのページ引数を置き換える代わりに、リンクは別のページ引数をURLに追加します。URLは最終的に「/all/az/page-1/page-2/」のようになります。

それは

'<a href=page-{{next}}>Next Page> ({{next}})</a>'

現在の URL に相対的なページへのリンクであり、現在の URL には既に /page-1/ が含まれています。

オプションの引数としてページを持たないことが実際に機能し、DjangoがURLの古いページ部分を置き換える方法がわかりません

私が提案することの1つは、相対URLを定義する代わりに、絶対URLを定義することです

'<a href="/<other-part-of-url>/page-{{ next }}">Next Page> ({{ next }})</a>'
于 2010-10-08T15:37:06.090 に答える