如何设置' next'参数通过Django中的extra_context

时间:2015-04-24 12:05:38

标签: python django

我有一个在线电子商务系统。如果用户在下订单时未登录,则此视图会将他们引导至模板中显示的三个选项:登录,注册,不执行任何操作并继续订购详细信息页面。

我想修改用户选择登录时要重定向到的网址。我希望该网址成为他们刚刚订购的订单详情页面。

如您所见,我从会话中获取订单ID,使用订单ID构建网址,然后将其打包在extra_context字典中。

def loginorsignup(request):
    if 'user_just_ordered' not in request.session:
        return HttpResponseRedirect(urlresolvers.reverse('signup'))

    orderid = request.session['orderid']
    next = '/order/' + orderid
    extra_context = {'next': next}

    if request.method == 'POST':
        postdata = request.POST.copy()
        if postdata['submit'] == 'Login':
            return HttpResponseRedirect(urlresolvers.reverse('login', kwargs={'extra_context': extra_context}))
        if postdata['submit'] == 'Create New Account':
            return HttpResponseRedirect(urlresolvers.reverse('signup'))
        if postdata['submit'] == 'Not Now':
            return HttpResponseRedirect(urlresolvers.reverse('orderwithid', args=(orderid,)))

    return render(request, 'registration/loginorsignup.html', locals())

当我在订单处理中到达这一点并点击“登录”时我收到这个错误:

NoReverseMatch at /users/loginorsignup/

1 个答案:

答案 0 :(得分:1)

当URLConf正则表达式包含命名组时,使用kwargs中的reverse参数。

示例:

# For a URL defined this way:
url(r'^users/(?P<user_id>\d+)/$', my_view, name='user_detail')

# You'll use reverse this way:
reverse('user_detail', kwargs={'user_id': some_user_id})

您想要的是将GET参数添加到您的网址。你可以通过这种方式实现:

from urllib import urlencode

bare_url = urlresolvers.reverse('login')
encoded_get_params = urlencode({'next': next})
separator = '&' if '?' in bare_url else '?'
url = '{}{}{}'.format(bare_url, separator, encoded_get_params))