问题描述
首先,你的URL定义根本不接受任何参数。如果要将参数从URL传递到视图中,则需要在URLconf中定义它们。
其次,还不清楚你对cleaned_data字典会发生什么。别忘了你不能重定向到POST-这是HTTP的局限性,而不是Django-因此你的cleaned_data要么需要是一个URL参数(可怕的),要么是一系列更好的GET参数-因此,URL将采用以下形式:
/link/mybackend/?field1=value1&field2=value2&field3=value3
等等。在这种情况下,URLconf定义中不包括field1,field2和field3,它们可通过查看在视图中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))
评论后编辑
一直以来,使用重定向和反向操作的全部目的是转到URL-它返回一个Http代码,该代码使浏览器重定向到新URL并进行调用。
如果你只想从代码中调用视图,则直接执行即可-根本不需要使用反向。
就是说,如果你只想存储数据,那么只需将其放入会话中即可:
request.session['temp_data'] = form.cleaned_data
解决方法
在我的视图函数中,我想调用另一个视图并将数据传递给它:
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?还有更重要的是,我的funciotn调用(如果需要,还有一个网址)应该是什么样子?后端和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,data):
仍然是NoReverseMatch。但是在django注册中,我看到了这样的内容:
url(r'^register/$',register,{'backend': 'registration.backends.default.DefaultBackend'},name='registration_register'),def register(request,success_url=None,form_class=None,disallowed_url='registration_disallowed',template_name='user/login_logout_register/registration_form.html',extra_context=None):