Django return HttpResponseRedirect to an url with a parameter

僤鯓⒐⒋嵵緔 提交于 2020-01-10 07:52:09

问题


I have a situation in my project where i need to make a redirection of the user to an url containing a parameter, (it is declared in the urls.py like:

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

How can i put that parameter in the return HttpResponseRedirect? I tried like: return HttpResponseRedirect('/classroom/notamember/classname'),anyway, this is foolish, i know, i cannot consider the 'classmane' as a parameter. For clarity, my view is:

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

how can i include the variable 'theclass' in that url? Thanks a lot!


回答1:


Try this:

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

EDIT:

This is surely better (Daniel Roseman's answer):

from django.core.urlresolvers import reverse

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



回答2:


This should not be complicated. The argument to HttpResponseRedirect is simply a string, so the normal rules for building up a string apply here. However, I don't think you want the theclass variable in there, as that is a ClassRoom object, not a string. You presumably want the classname instead. adamk has given you the right answer here.

However, having said that you can just use a string, what you should actually do is use the reverse function. This is because you might later decide to change the URL structure, and rather than having to look through your code finding each place you've hard-coded the URL string, you should rely on having defined them in one single place: your urls.py file. So you should do something like this:

from django.core.urlresolvers import reverse

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



回答3:


Actually, the shortcut redirect takes view names and model (which has get_absolute_url defined) names too.

from django.shortcuts import redirect

return redirect(leave_classroom)



回答4:


When everything seems not to be working i use return render and check if it is post request in case anybody refresh the page

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

The local() make the parameter accessible on the template




回答5:


If you are submitting to the same URL, you can use the following to pass parameters.

 template_name = '/classroom/notamember.html'

return render(
                request,
                self.template_name,
                {'classname': 'classname', 'secondvariable': 'variable' }
            )


来源:https://stackoverflow.com/questions/3139973/django-return-httpresponseredirect-to-an-url-with-a-parameter

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!