ページ番号が無効な場合(例:localhost /?page = 9999)、Djangoは404エラーを表示します。Django:クラスベースのビューでInvalidPage例外をキャッチする方法はありますか
しかし、最初のページにリダイレクトします。関数ベースのビューでは、InvalidPage例外をキャッチすることでこれを行うことができます。
誰でもクラスベースのビューでそれを行う方法を知っていますか?
ありがとうございます。
ページ番号が無効な場合(例:localhost /?page = 9999)、Djangoは404エラーを表示します。Django:クラスベースのビューでInvalidPage例外をキャッチする方法はありますか
しかし、最初のページにリダイレクトします。関数ベースのビューでは、InvalidPage例外をキャッチすることでこれを行うことができます。
誰でもクラスベースのビューでそれを行う方法を知っていますか?
ありがとうございます。
クラス内のget_paginator
を上書きして、そこで小切手を実行してください。
class MyListView(ListView):
...
def get_paginator(self, queryset, per_page, orphans=0, allow_empty_first_page=True):
paginator = super(MyListView, self).get_paginator(queryset, per_page, orphans=orphans, allow_empty_first_page=allow_empty_first_page)
try:
paginator.page(self.kwargs.get('page', 1))
except EmptyPage: # or InvalidPage, but that's less precise
self.is_empty = True
return paginator
def dispatch(self, request, *args, **kwargs):
response = super(MyListView, self).dispatch(request, *args, **kwargs)
if getattr(self, 'is_empty', False):
return HttpResponseRedirect('/some/other/url/')
else:
return response
コールget_context_data
とHttp404
ではなくInvalidPage
をキャッチ:次にリダイレクトまたは通常のビューを返すためにdispatch
をオーバーライドします。
次に、ページ値を1に割り当て、get_context_data
を呼び出します。
class MyListView(ListView):
def get_context_data(self, **kwargs):
try:
return super(MyListView, self).get_context_data(**kwargs)
except Http404:
self.kwargs['page'] = 1
return super(MyListView, self).get_context_data(**kwargs)
さらに詳しい情報:
https://code.djangoproject.com/browser/django/trunk/django/views/generic/list.py#L33
https://code.djangoproject.com/browser/django/trunk/django/views/generic/list.py#L84
これは機能しませんでした。 – Julian
前の回答のどちらも私のために問題を解決しました。たぶん彼らは一度にやったかもしれない。私は人々がURLを考えたくないので、私は、リダイレクトを行う
def get(self, *args, **kwargs):
request = self.request
try:
return super(MyListView, self).get(*args, **kwargs)
except Http404:
if request.GET.get('page', 1) == 1:
raise
page1 = request.GET.copy()
del page1['page']
return redirect('%s?%s' % (request.path, page1.urlencode()))
有効である - そこにページNではありません、我々は適切にその私たちを反映したい:ここで私はジャンゴ1.3.1を使用していた方法ですページ1に戻しています。
ListView
クラスのget_context_data
メソッドをオーバーライドしてください。私のプロジェクトではうまくいきます。 @Coc Bのコードを使用してください。
もちろん、MyListView
をクラス名に置き換えることを忘れないでください。
あなたの答えをありがとう。引数なしでpaginator.page()を呼び出すことはできますか? – Tianissimo
申し訳ありませんが、私は上記の答えを更新しました。私はまた、私の発送方法の別の問題に気づいた。それは今でも正しいです。 –
こんにちは、私はあなたのコードを試して、それは動作しませんでした。私は2つの問題を発見しました。1)super()。dispatch()は変数に保持されずにただちに応答を返すように見えるので、getattr(...)の行は呼び出されません。 2)get_paginatorメソッドはディスパッチメソッドの後に呼び出されます。 – Tianissimo