在我的视图函数中,我想调用另一个视图并将数据传递给它:
return redirect('some-view-name', backend, form.cleaned_data)
,其中 backend 是 registration.backends 对象,而 form.cleaned_data 是表单数据的字典(但两者都必须作为 *args 或 **kwargs 发送以防止引发 Don't mix *args and **kwargs in call to reverse()!
错误)。根据我在文档中发现的内容:
def my_view(request):
...
return redirect('some-view-name', foo='bar')
看起来我需要提供“some-view-name”参数,但它只是视图函数的名称,还是 url 的名称?所以我想让它类似于在 django-registration 中完成的方式,其中:
to, args, kwargs = backend.post_registration_redirect(request, new_user)
return redirect(to, *args, **kwargs)
def post_registration_redirect(self, request, user):
return ('registration_complete', (), {})
好的,现在,我可以直接调用我的视图函数还是需要为它提供一个 url?更重要的是,我的函数调用(如果需要的话还有一个 url)应该是什么样子? backend 和 cleaned_data 都只是通过此视图传递以供以后使用。我试过这个,但这是不合适的:
url(r'^link/$', some-view-name)
def some-view-name(request, *args):
以及这个:
return redirect('some_url', backend=backend, dataform.cleaned_data)
url(r'^link/$', some-view-name)
def some-view-name(request, backend, data):
仍然是 NoReverseMatch 。但是在 django-registration 中,我看到了这样的事情:
url(r'^register/$',register,{'backend': 'registration.backends.default.DefaultBackend'}, name='registration_register'),
def register(request, backend, success_url=None, form_class=None,
disallowed_url='registration_disallowed',
template_name='user/login_logout_register/registration_form.html',
extra_context=None):
原文由 muntu 发布,翻译遵循 CC BY-SA 4.0 许可协议
首先,您的 URL 定义根本不接受任何参数。如果您希望将参数从 URL 传递到视图中,您需要在 urlconf 中定义它们。
其次,您对 cleaned_data 字典的预期结果一点也不清楚。不要忘记你不能重定向到 POST - 这是 HTTP 的限制,而不是 Django - 所以你的 cleaned_data 要么需要是一个 URL 参数(可怕的),或者更好一点,一系列 GET 参数 - 所以 URL将采用以下形式:
等等。在这种情况下,field1、field2 和 field3 不 包含在 URLconf 定义中 - 它们在视图中可用
request.GET
。所以你的 urlconf 将是:
视图看起来像:
反过来是(导入后
urllib
):评论后编辑
正如您一直在做的那样,使用重定向和反向的全部意义在于您转到 URL - 它返回一个 Http 代码,使浏览器重定向到新的 URL,并调用它。
如果您只是想从您的代码中调用视图,只需直接执行 - 根本不需要使用 reverse。
也就是说,如果您只想存储数据,那么只需将其放入会话中即可: