Django将HttpResponseRedirect返回到带参数的url

问题描述 投票:28回答:4

我的项目中有一种情况,我需要将用户重定向到包含参数的url(它在urls.py中声明如下:

url(r'^notamember/(?P<classname>\w+)/$', 
                           notamember,
                           name='notamember'),)

如何将该参数放入返回HttpResponseRedirect?我尝试过:返回HttpResponseRedirect('/ classroom / notamember / classname'),无论如何,这是愚蠢的,我知道,我不能把'classmane'当作参数。为清楚起见,我的观点是:

def leave_classroom(request,classname):
theclass = Classroom.objects.get(classname = classname)
u = Membership.objects.filter(classroom=theclass).get(member = request.user).delete()
return HttpResponseRedirect('/classroom/notamember/theclass/')

我怎样才能在该网址中包含变量'theclass'?非常感谢!

django url httpresponse urlvariables
4个回答
42
投票

试试这个:

return HttpResponseRedirect('/classroom/notamember/%s/' % classname)

编辑:

这肯定更好(Daniel Roseman的回答):

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)

51
投票

这应该不复杂。 HttpResponseRedirect的参数只是一个字符串,因此构建字符串的常规规则适用于此处。但是,我认为你不想在那里使用theclass变量,因为那是一个ClassRoom对象,而不是字符串。你可能想要classname。 adamk在这里给了你正确的答案。

但是,说过你可以使用一个字符串,你应该做的是使用reverse函数。这是因为您以后可能决定更改URL结构,而不是必须查看代码,找到您对URL字符串进行硬编码的每个地方,您应该依赖于在一个地方定义它们:您的网址。 py文件。所以你应该做这样的事情:

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)

4
投票

实际上,快捷方式redirect也采用视图名称和模型(其中定义了get_absolute_url)。

from django.shortcuts import redirect

return redirect(leave_classroom)

0
投票

当一切似乎都没有工作时,我使用返回渲染并检查它是否是发布请求以防任何人刷新页面

if request.POST:
    message = "Thank you."
    return render(request, 'index.html', locals())
return HttpResponseRedirect('/')

local()使模板上的参数可访问


0
投票

如果您要提交相同的URL,则可以使用以下内容传递参数。

 template_name = '/classroom/notamember.html'

return render(
                request,
                self.template_name,
                {'classname': 'classname', 'secondvariable': 'variable' }
            )
© www.soinside.com 2019 - 2024. All rights reserved.