我有一个在线电子商务系统。如果用户在下订单时未登录,则此视图会将他们引导至模板中显示的三个选项:登录,注册,不执行任何操作并继续订购详细信息页面。
我想修改用户选择登录时要重定向到的网址。我希望该网址成为他们刚刚订购的订单详情页面。
如您所见,我从会话中获取订单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/
答案 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))