重定向时,是否可以将非URL定义视图关键字传递给视图函数?

时间:2012-01-25 08:22:13

标签: django django-urls

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。

2 个答案:

答案 0 :(得分:2)

不,重定向时,您无法将“额外关键字”传递给视图功能。我会试着解释原因。

当您返回HttpResponseRedirect时,Django会返回一个包含302状态代码和新位置的响应。

HTTP/1.1 302 Found
Location: http://www.example.com/new-url/

您的浏览器通常会获取新网址,但这是一个单独的请求。如果您的视图需要关键字,则需要以某种方式将其包含在该响应中,除非您在会话中存储状态。你的两个选择是

  1. 在网址中包含额外的关键字:

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

  2. 将extra关键字包含为GET参数

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

    然后在您的视图中,使用keyword=request.GET['keyword']抓取关键字。请注意,关键字在视图签名中不再是kwarg。

  3. 第三种方法是在重定向之前将关键字粘贴到session,然后在重定向视图中将其抓出。我建议不要这样做,因为它是有状态的,当用户刷新页面等时会导致奇怪的结果。

答案 1 :(得分:1)

您的run_details网址根本不接受名为kwarg的{​​{1}} - 将其从您的反向kwargs中删除。