我有一个基于类的视图( RegistrationView
),我想将参数值传递给重定向,如下所示 .
# views.py
def hook(request):
return HttpResponseRedirect(reverse('registration_register',
kwargs={'initial': {'email': 'user@example.com'}}))
我的伴随URL模式定义为:
# urls.py
urlpatterns = [
url(r'^account/register/$',
RegistrationView.as_view(form_class=RegistrationForm),
name='registration_register'),
]
而initial是 RegistrationView
中的有效参数值 .
但是,当我运行它时,我遇到了以下错误,因为我没有在我的网址中定义参数(如果可能的话,我不想在url路径中定义参数) .
使用参数'()'和关键字参数'{'initial':{'email':'user@example.com'}}'找不到'registration_register' . 1种模式尝试:['account / register / $']
我遇到了以下query,其中讨论了将关键字参数传递给基于类的视图,但是,我无法使用上述代码 .
从概念上讲,我想要实现的是相当于下面的内容,除了使用 HttpRedirect
而不是生成直接响应 .
def hook(request):
return RegistrationView.as_view(
form_class=RegistrationForm, initial={'email': 'user@example.com'})(request)
是否有人能够建议我如何使用此初始参数值重定向到我的视图?
2 回答
你混淆了几件事 .
使用
args
和kwargs
传递给reverse
的参数用于构建URL . 对于接受这些参数的视图,相应的URL模式必须具有占位符 .看看这个例子:
如果您想传递任何额外信息,可以使用查询参数,例如
/polls/123/?foo=bar
reverse
仅负责URL的路径部分,即直到?
,您必须手动构建整个 .您可以使用
request.GET
访问视图中的查询参数,在此示例中为request.GET.get('foo')
.现在,关于基于类的视图 . 简单来说,
as_view()
是一个错误的地方,寻找传递每个请求应该不同的参数 . 在引擎盖下,表达式RegistrationView.as_view(form_class=RegistrationForm)
创建了一个工厂函数,它为每个请求实例化一个新的RegistrationView实例 .as_view()
"stores"其参数并将它们传递给RegistrationView.__init__()
.TL;DR:
将电子邮件作为查询参数传递,如登录URL中的参数
next
.如果
RegistrationView
是标准FormView
,则可以覆盖get_initial
以获取参数 .好吧,正如你所说,你没有在你的URL中定义那个参数,所以我不知道你认为反向函数会用它做什么 . 尽管你说它是RegistrationView的“有效参数”,但很明显该视图也不期望该参数 .
如果要通过
reverse
传递此数据,则需要编写一个确实需要参数的视图,并为其提供一个接受这些参数的URL .另一种方法是使用会话传递此数据 .