2012-01-25 5 views
0
NoReverseMatch at /natrium/script/4c55be7f74312bfd435e4f672e83f44374a046a6aa08729aad6b0b1ab84a8274/ 

Reverse for 'run_details' with arguments '()' and keyword arguments '{'script_text': u'print "happy"', 'run_id': '6b2f9127071968c099673254fb3efbaf'}' not found. 

これは抜粋リダイレクト時に、非URL定義ビューのキーワードをビュー関数に渡すことはできますか?

def run_details(request, run_id, script_text): 
    """ 
    Displays the details of a given run. 
    """ 
    run = Run(run_id) 
    run.update(request.user) 

    codebundle = CodeBundle(run.cbid) 
    codebundle.update(request.user) 

    return render_response(request, "graphyte/runs/run_script.html", 
          {'run':run, 'codebundle':codebundle, 'files':run.artifacts, 'bundle':codebundle, 
          'source_code': script_text 
          }) 

このビュー関数を呼び出す順番に今これは私のurls.py.ある私のviews.pyの

run_id = new_run.run_id 
if not run_id: 
raise AssertionError("bad run id") 

# I tried with args=[run_id, clean['script_text']] too 
return HttpResponseRedirect(reverse('run_details', kwargs={'run_id':run_id, 'script_text':clean['script_text']})) 

です実際のリダイレクトビューは別のアプリにあります(ちょっと気違いですが...)。

urlpatterns = patterns("webclient.apps.codebundles.views", 
    # many..... 
    url(r"^cb/newfolder/$", 'codebundle_newfolder', name="codebundle_newfolder"), 
) 

urlpatterns += patterns('webclient.apps.runs.views', 
     url(r"^run_details/(?P<run_id>\w+)/$", 'run_details', name="run_details"),) 

これは、過去3時間では本当に厄介なものになっています。私は何が起こっているのか分かりません。誰かがこれをデバッグする手助けができますか?

ありがとうございました。


元のプランはscript_textを持たず、args = ['run_id']のみを使用しました。できます。言い換えると、すべてが動く2つのビューからscript_textを削除します。混乱させて申し訳ありません


EDIT 。スクリプトのテキストは、逆の送り先に渡す必要のあるコンテキスト変数であり、そこからテンプレートをレンダリングします。 URLにはrun_idのみが表示されます。

答えて

2

いいえ、リダイレクト時に表示機能に実際には「余分なキーワード」を渡すことはできません。理由を説明しようとします。

HttpResponseRedirectを返すと、Djangoはステータスコード302と新しい場所の応答を返します。

ブラウザは通常、新しいURLを取得しますが、これは別のリクエストです。ビューにキーワードが必要な場合は、セッションに状態を格納しない限り、その応答に何らかの形で含める必要があります。あなたの2つのオプションが

  1. あるURL内の余分なキーワードを含める:あなたのビューで次にGETパラメータとして

    http://www.example.com/new-url/?keyword=keyword-value.

    を余分にキーワードを含める

    http://www.example.com/new-url/keyword-value/

  2. を、keyword=request.GET['keyword']でキーワードを取得します。ビューのシグネチャでは、キーワードはもはやkwargではないことに注意してください。

第三のアプローチは、あなたがリダイレクトし、リダイレクトビューでセッションをそれをつかむ前sessionにキーワードを固執することです。ステートフルであり、ユーザーがページなどをリフレッシュしたときに奇妙な結果を引き起こす可能性があるため、これを行うことを控えてください。

+0

詳細をご覧いただきありがとうございます。 script_textはソースコードの文字列なので、URLに入れるのは面倒なことではありません。セッションは回避策になるかもしれません(gloablと同等です変数、これは今私がテストに使っているものです)。 – CppLearner

1

あなたのrun_detailsのURLはscript_textという名前のkwargを一切受け付けていません。逆のkwargsから削除してください。

+0

右。私の悪い。私は自分の投稿を編集しました。元の計画はscript_textを持っていませんでした。それはURLがキャプチャキーワードだけを読み込むためですか?捕捉されないビュー関数でキーワードを投げることも可能ですか? – CppLearner

+1

あなたは確かに(例えばURL定義の3番目の引数として)ビュー関数にkwargsを送ることができますが、存在しないkwargsの組み合わせについてはURLを反転することはできません。 'reverse'では、あなたはdjangoにこう言います:"ねえ、これらの引数とこれらのキーワードを正確に受け入れるURLを私に与えてください "。 –

+0

私は逆を使う理由は物事をよりモジュラー化することだと思います。私は最初のvirewsにrun_detailsを入れてそこからテンプレートをレンダリングすることができます。私と一緒に熊。あなたは**逆**とsayignですか?私はURLの定義(http://mysite.com/natrium/run_details/run_id/)の一部ではないkwargsにスローすることはできませんか?ありがとう。 – CppLearner

関連する問題