首页 文章

将参数从重定向传递到基于类的视图

提问于
浏览
0

我有一个基于类的视图( 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 回答

  • 1

    你混淆了几件事 .

    使用 argskwargs 传递给 reverse 的参数用于构建URL . 对于接受这些参数的视图,相应的URL模式必须具有占位符 .

    看看这个例子:

    # urls.py
    ...
    url(r'^/polls/(?P<question_id>[0-9]+)/$', views.detail, name='detail'),
    ...
    
    # views.py
    def detail(request, question_id):
        return HttpResponse("You're looking at question %s." % question_id)
    
    >>> reverse('detail', kwargs={'question_id': 123})
    '/polls/123/'
    

    如果您想传递任何额外信息,可以使用查询参数,例如

    /polls/123/?foo=bar

    reverse 仅负责URL的路径部分,即直到 ? ,您必须手动构建整个 .

    django.utils.http import urlencode
    path = reverse('detail', kwargs={'question_id': 123})
    params = urlencode({'foo': 'bar'})
    url = "%s?%s" % (path, params)
    

    您可以使用 request.GET 访问视图中的查询参数,在此示例中为 request.GET.get('foo') .

    现在,关于基于类的视图 . 简单来说, as_view() 是一个错误的地方,寻找传递每个请求应该不同的参数 . 在引擎盖下,表达式 RegistrationView.as_view(form_class=RegistrationForm) 创建了一个工厂函数,它为每个请求实例化一个新的RegistrationView实例 . as_view() "stores"其参数并将它们传递给 RegistrationView.__init__() .

    TL;DR:

    将电子邮件作为查询参数传递,如登录URL中的参数 next .

    /account/register/?email=user@example.com
    

    如果 RegistrationView 是标准 FormView ,则可以覆盖 get_initial 以获取参数 .

    def get_initial(self):
        initial = super(RegistrationView, self).get_initial()
        email = self.request.GET.get('email')
        if email is not None:
            initial['email'] = email
        return initial
    
  • 3

    好吧,正如你所说,你没有在你的URL中定义那个参数,所以我不知道你认为反向函数会用它做什么 . 尽管你说它是RegistrationView的“有效参数”,但很明显该视图也不期望该参数 .

    如果要通过 reverse 传递此数据,则需要编写一个确实需要参数的视图,并为其提供一个接受这些参数的URL .

    另一种方法是使用会话传递此数据 .

相关问题