Django将HttpResponseRedirect返回到带参数的url

dan*_*ana 31 django url httpresponse urlvariables

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

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

如何将该参数放入返回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/')
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*man 52

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

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

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
Run Code Online (Sandbox Code Playgroud)


ada*_*amk 43

试试这个:

return HttpResponseRedirect('/classroom/notamember/%s/' % classname)
Run Code Online (Sandbox Code Playgroud)

编辑:

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

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
Run Code Online (Sandbox Code Playgroud)

  • 丹尼尔的答案是一个比这个更好的解决方案.urls.py中的url可能会在以后更改.使用此方法,您必须找到它发生的所有位置并相应地更改,而如果您使用将自动发生的reverse(). (4认同)

Lak*_*sad 5

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

from django.shortcuts import redirect

return redirect(leave_classroom)
Run Code Online (Sandbox Code Playgroud)