Django redirect() 函数如何传递额外参数

3
为什么当我尝试传递额外参数时,会出现以下错误:
以下代码可以正常运行!(不带参数)
def first(request):
    return redirect('confirm')

def confirm(request):
    return render(request, 'template.html')

然而,这正是我需要的,但它没有按预期工作,出现了以下错误:

Reverse for 'confirm' with keyword arguments '{'email': 'email'}' not found. 1 pattern(s) tried: ['book/booking_confirmation/$']

def first(request):
    return redirect('confirm', email='some_email')

def confirm(request, email):
    return render(request, 'template.html', { 'email': email} )

urls.py

urlpatterns += [
    url(r'^booking_confirmation/$', views.confirm, name='confirm'),
]

首先,你的第一个代码片段是不会起作用的,因为 redirect 不需要 request 参数。其次,redirect 告诉浏览器去访问另一个 URL。确认 URL 是否需要 email 参数? - Daniel Roseman
抱歉,我只是在尝试修复它并添加了“request”。如果我将其删除,我会收到错误消息:“使用关键字参数'{ 'email':'email'}'未找到'confirm'的反向引用。尝试了1个模式:['book/booking_confirmation/$']。”基本上,我想在最后有一个个性化的确认页面,显示我们已经向该电子邮件发送了确认信息。 - GRS
好的,就像我问的那样,确认页面的URL是否需要一个“email”参数? - Daniel Roseman
哦,好吧,这就是我想从“first”函数传递的参数。也许这不是它的工作方式。我想将来自“first()”的电子邮件传递给由“confirm()”呈现的视图。 - GRS
2个回答

10
如果你不想通过URL重定向传递电子邮件,将其存储在会话中可能是最简单的方法。
def first(request):
    request.session['email'] = 'some_email'
    return redirect('confirm')

def confirm(request):
    return render(request, 'template.html', {'email': request.session['email']})

哇,我没想到会有那种“诀窍”。谢谢。 - naheliegend
太棒了,救了我的一天。不错。 - Msvstl

2

配置URL模式以捕获电子邮件地址。例如

urlpatterns += [
    url(r'^booking_confirmation/(?P<email>\w+)$', views.confirm, name='confirm'),
]

您可以使用更加强大的模式匹配方式来捕获电子邮件,而不仅仅是捕获单词字符。

这正是我需要的,但是不将电子邮件值放在URL中,是否有可能? - GRS
威尔·基林(Will Keeling)说了什么。 - Oluwafemi Sule

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接