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) # ...