38

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

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

我怎样才能把这个参数放在 return 中HttpResponseRedirect?我试过像:

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

无论如何,这很愚蠢,我知道,我不能将classmane视为参数。为清楚起见,我的view.py是:

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/')

我怎样才能在其中包含变量theclassurl?非常感谢!

4

5 回答 5

60

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

然而,说了你可以只使用一个字符串,你实际上应该做的是使用这个reverse函数。这是因为您以后可能会决定更改 URL 结构,而不是必须查看代码来查找硬编码 URL 字符串的每个位置,而应该依赖于在一个位置定义它们:您的 url。 .py 文件。所以你应该做这样的事情:

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
于 2010-06-29T11:32:08.943 回答
52

试试这个:

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

编辑:

这肯定更好(丹尼尔罗斯曼的回答):

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
于 2010-06-29T11:02:45.787 回答
5

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

from django.shortcuts import redirect

return redirect(leave_classroom)
于 2010-06-29T13:31:54.703 回答
0

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

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

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

于 2019-02-25T17:56:44.180 回答
0

如果你提交到同一个 URL,你可以使用下面的来传递参数。

 template_name = '/classroom/notamember.html'

return render(
                request,
                self.template_name,
                {'classname': 'classname', 'secondvariable': 'variable' }
            )
于 2019-07-10T13:06:03.243 回答