2012-01-17 11 views
2

ページ番号が無効な場合(例:localhost /?page = 9999)、Djangoは404エラーを表示します。Django:クラスベースのビューでInvalidPage例外をキャッチする方法はありますか

しかし、最初のページにリダイレクトします。関数ベースのビューでは、InvalidPage例外をキャッチすることでこれを行うことができます。

誰でもクラスベースのビューでそれを行う方法を知っていますか?

ありがとうございます。

答えて

-1

クラス内の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 
+0

あなたの答えをありがとう。引数なしでpaginator.page()を呼び出すことはできますか? – Tianissimo

+0

申し訳ありませんが、私は上記の答えを更新しました。私はまた、私の発送方法の別の問題に気づいた。それは今でも正しいです。 –

+1

こんにちは、私はあなたのコードを試して、それは動作しませんでした。私は2つの問題を発見しました。1)super()。dispatch()は変数に保持されずにただちに応答を返すように見えるので、getattr(...)の行は呼び出されません。 2)get_paginatorメソッドはディスパッチメソッドの後に呼び出されます。 – Tianissimo

0

コールget_context_dataHttp404ではなく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

+0

これは機能しませんでした。 – Julian

1

前の回答のどちらも私のために問題を解決しました。たぶん彼らは一度にやったかもしれない。私は人々が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に戻しています。

0

ListViewクラスのget_context_dataメソッドをオーバーライドしてください。私のプロジェクトではうまくいきます。 @Coc Bのコードを使用してください。

もちろん、MyListViewをクラス名に置き換えることを忘れないでください。

関連する問題