2012-01-19 5 views
9

私はpythonとdjangoには新しく、リダイレクト機能に関する質問があります。Djangoはkwargでリダイレクトします

これは私のviews.pyファイルの縮小バージョンです。

def page_index(request, error_message=''): 
    print error_message 

def add_page(request): 
    return redirect('page_index') # this work fine 
    return redirect('page_index', error_message='test') # this does not work 

そして、ここで私はすべてが正常に動作しますが、私はkwagを使用するときに、私は次のエラーを取得するキーワード引数なしpage_indexにリダイレクトしようとすると、私のurls.py

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', {'error_message': 't'}, name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 

の短いバージョンです。メッセージ:

NoReverseMatchの引数を持つ 'page_index' のリバース '(')

ページ/追加/

/時dキーワード引数 '{' error_message ':'テスト '}'が見つかりません。

私は間違っていますか?

答えて

10

短い答え:あなたのURLスキームに 'error_message'キーワードがありません。

長い答え:

リダイレクト()関数は、URLを構築するために逆に()を呼び出すことです。 302リダイレクトステータスコードと新しいURLを返すことで、そのURLにユーザーのブラウザを送信します。あなたがreverse()に与えるキーワード引数は、URLの一部として終わるはずです。つまり、それらがユーザーにどのように伝達されるのでしょうか。

「page_index」のURLは「^ $」として定義されています。これはブラウザの「http://yoursite.com/」のように見えるルートURLです。

他の情報を含むリダイレクトを発行できるようにするには、URLに場所を定義するか、別の方法で追加する必要があります。

次の3つの方法が、このためにかなり共通しています

  1. は、クエリパラメータを使用します - これは、明示的にクライアントにメッセージを送信します。あなたが慎重でない場合、人々はあなたのインデックスページに彼らがそれが望むものを言うようにするためにURLを作ることができます。

    return redirect(reverse('page-index')+"?error_message=test")) 
    
  2. セッションにメッセージを隠しておくとするとき、次のページが読み込まそれを引き出す - これは、あなたが設定されたセッションを持っていることを必要とし、サーバ側ですべてを追跡し、のではなく、クライアントに頼りますこれは、アドホックセッション属性よりも優先されて、限り、あなたは上のメッセージのあまりに多くの「種類」を必要としないよう - このためのメッセージフレームワークを使用し

    def add_page(request): 
        request.session['error_message'] = 'test' 
        return redirect('page-index') 
    
    def page_index(request): 
        print request.session.get('error_message','') 
    
  3. :あなたのエラーメッセージを送り返します同じページ。あなたが持っているすべてのエラーメッセージのテンプレート内のスペースである場合は、しかし、これは本当に簡単です:あなたのベーステンプレートで、その後

    from django.contrib.messages import error 
    
    def add_page(request): 
        error(request, 'test') 
        return redirect('page-index') 
    

    そして、これよりもおそらくより複雑なこのどこか(のようなブロックを持っています。スタイル付き、さえ):

    {% for message in messages %} 
        <p>{{ message }}</p> 
    {% endfor %} 
    

では、両方の すべてのケースでは、しかし、あなたはあなたのurls.pyから引数を削除することができます - メッセージ自体は、のパスコンポーネントの一部であることを行っていませんURL。

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 
+0

情報との見解を呼び出す方法がありますが、URLではないthatsの? – Justus1

+0

はい、Pythonで行います。add_pageビューから 'return page_index(error_message = 'test')'を実行するだけです。 –

+1

あなたがそれを行うと、URLは変更されません、私には悪いパターンと思われる現在のビュー(add_page)に別のビュー(page_index)の内容を返しました。また、独自のセッションベースのメッセージングソリューションをローリングする代わりに、Djangoの組み込みの[メッセージフレームワーク](https://docs.djangoproject.com/en/1)を使用することをお勧めします。3/ref/contrib/messages /) – Anentropic

0

redirect(それはHTTPリダイレクトだけではなく、Pythonの呼び出しです)実際のURLにリダイレクトする必要があります。

デフォルトでビューファンクションがkwargとしてerror_messageで呼び出されるように、あなたが設定したにもかかわらず、url confに 'error_message'セグメントはありません。

これはインデックスページなので、URLに余分なパスセグメントを追加したくない場合は、おそらくGETバールを使ってハックアップすることができます。例えば

def page_index(request): 
    if 'error_message' in request.GET: 
     print request.GET['error_message'] 

from django.core.urlresolvers import reverse 

def add_page(request): 
    return redirect('%s?error_message=test' % reverse('page_index')) 

urlpatterns = patterns(
    'x.views', 
    url(r'^$', 'page_index', name='page_index'), 
    url(r'^add/$', 'add_page', name='add_page'), 
) 

更新:あなたの質問は、リダイレクトとkwargsからなどについてですが、私は、家に歩いて、この考えるが

、ここでは間違いなくより良いオプションは、Djangoのmessages frameworkを使用し、完全にerror_messageを残すことであろうあなたのビューkwargsからの外に、GETなどの変数

例えば

from django.contrib import messages 

def add_page(request): 
    messages.add_message(request, messages.ERROR, 'test') 
    return redirect('page_index') 

これはまた、セキュリティリスクの可能性がある独自のエラーメッセージを作成してURLを作成することを回避します。

2

あなたはそれぞれのエラーメッセージの名前のURLパターンを作成し、このように、引数の辞書にそれを渡すことができ、次のいずれか

url(r'^$', 'page_index', {'error_message': 'test'}, name='test_page_index'), 

か、実際のURLであなたをエラーメッセージを入れて喜んでいる場合このために選ぶことができます:

url(r'(?P"<"error_message">"\w+)/^$', 'page_index', name='page_index'), 

(<「周り」「削除してください」と「>」、括弧に入れなければならなかったか、彼らは、フォームの回答は除外されるだろう、私はANのように見えるすべてのものを推測HTMLタグは除外されます)

とビューで:

return redirect(reverse('page_index', args=['test'])) 
関連する問題