Django返回redirect()与参数

在我的视图函数中,我想调用另一个视图并将数据传递给它:

return redirect('some-view-name', backend, form.cleaned_data) 

,其中后端是registration.backends对象,而form.cleaned_data是表单数据的字典(但是两者都必须作为* args或** kwargs发送,以防止引发Don't mix *args and **kwargs in call to reverse()!错误)。 从我在文档中find的内容:

 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', (), {}) 

好,那么现在,我可以直接调用我的视图function,或者我需要提供一个URL吗? 更重要的是,我的funciotn如何调用(以及需要的url)应该是什么样子? 后端和cleared_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注册,我已经看到这样的事情:

 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): 

首先,你的URL定义根本不接受任何参数。 如果你想要参数从URL传递到视图,你需要在urlconf中定义它们。

其次,清楚你想要发生在clean_data字典里,一点也不清楚。 不要忘记,你不能redirect到一个POST – 这是HTTP的限制,而不是Django – 所以你的清洁数据要么需要是一个URL参数(可怕的),或者稍微好点的一系列的GET参数 – 所以URL将采取以下forms:

 /link/mybackend/?field1=value1&field2=value2&field3=value3 

等等。 在这种情况下,field1,field2和field3 包含在URLconf定义中 – 它们在request.GET的视图中可用。

所以你的urlconf将是:

 url(r'^link/(?P<backend>\w+?)/$', my_function) 

并且该视图看起来像:

 def my_function(request, backend): data = request.GET 

反过来(在导入urllib ):

 return "%s?%s" % (redirect('my_function', args=(backend,)), urllib.urlencode(form.cleaned_data)) 

在评论后编辑

正如你一直在做的那样,使用redirect和反向的重点是你去到URL–它返回一个Http代码,使浏览器redirect到新的URL,然后调用它。

如果你只是想从你的代码中调用视图,就直接执行 – 根本不需要使用反转。

这就是说,如果你想要做的只是存储数据,那么就把它放在会话中:

 request.session['temp_data'] = form.cleaned_data 

urls.py:

 #... url(r'element/update/(?P<pk>\d+)/$', 'element.views.element_update', name='element_update'), 

views.py:

 from django.shortcuts import redirect from .models import Element def element_info(request): # ... element = Element.object.get(pk=1) return redirect('element_update', pk=element.id) def element_update(request, pk) # ...