NoReverseMatch at /natrium/script/4c55be7f74312bfd435e4f672e83f44374a046a6aa08729aad6b0b1ab84a8274/
Reverse for 'run_details' with arguments '()' and keyword arguments '{'script_text': u'print "happy"', 'run_id': '6b2f9127071968c099673254fb3efbaf'}' not found.
这是我的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']}))
依次调用此视图函数
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.实际的重定向视图在另一个应用程序中(有点疯狂,但无论如何......)。
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"),)
在过去的三个小时里,这真的很糟糕。我不确定发生了什么。有人可以帮我调试吗?
感谢。
原始计划没有script_text,我只使用了args = ['run_id']。有用。换句话说,从两个视图中删除script_text,一切都会有效。
修改 对困惑感到抱歉。脚本文本只是我需要传递到反向目标的上下文变量,并从那里我渲染我的模板。 URL应仅显示run_id。
答案 0 :(得分:2)
不,重定向时,您无法将“额外关键字”传递给视图功能。我会试着解释原因。
当您返回HttpResponseRedirect
时,Django会返回一个包含302状态代码和新位置的响应。
HTTP/1.1 302 Found
Location: http://www.example.com/new-url/
您的浏览器通常会获取新网址,但这是一个单独的请求。如果您的视图需要关键字,则需要以某种方式将其包含在该响应中,除非您在会话中存储状态。你的两个选择是
在网址中包含额外的关键字:
http://www.example.com/new-url/keyword-value/
将extra关键字包含为GET参数
http://www.example.com/new-url/?keyword=keyword-value.
然后在您的视图中,使用keyword=request.GET['keyword']
抓取关键字。请注意,关键字在视图签名中不再是kwarg。
第三种方法是在重定向之前将关键字粘贴到session,然后在重定向视图中将其抓出。我建议不要这样做,因为它是有状态的,当用户刷新页面等时会导致奇怪的结果。
答案 1 :(得分:1)
您的run_details
网址根本不接受名为kwarg
的{{1}} - 将其从您的反向kwargs中删除。