Django возвращает HttpResponseRedirect на URL с параметром - PullRequest
28 голосов
/ 29 июня 2010

У меня есть ситуация в моем проекте, где мне нужно сделать перенаправление пользователя на 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' в этот URL? Большое спасибо!

Ответы [ 5 ]

51 голосов
/ 29 июня 2010

Это не должно быть сложным.Аргументом HttpResponseRedirect является просто строка, поэтому здесь применяются нормальные правила для построения строки.Однако я не думаю, что вам нужна переменная theclass, поскольку это объект ClassRoom, а не строка.Вы, вероятно, хотите вместо этого classname.adamk дал вам правильный ответ здесь.

Однако, сказав, что вы можете просто использовать строку, на самом деле вы должны использовать функцию reverse.Это связано с тем, что позже вы можете решить изменить структуру URL-адреса, и вместо того, чтобы просматривать свой код и находить каждое место, где вы жестко запрограммировали строку URL-адреса, вы должны полагаться на то, что вы определили их в одном месте: ваши URL-адреса.пи файл.Поэтому вы должны сделать что-то вроде этого:

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
41 голосов
/ 29 июня 2010

Попробуйте это:

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

EDIT:

Это, безусловно, лучше (ответ Даниэля Роузмана):

from django.core.urlresolvers import reverse

url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
4 голосов
/ 29 июня 2010

На самом деле, ярлык redirect принимает имена видов и модели (для которых определено get_absolute_url).

from django.shortcuts import redirect

return redirect(leave_classroom)
0 голосов
/ 10 июля 2019

Если вы отправляете на тот же URL, вы можете использовать следующее для передачи параметров.

 template_name = '/classroom/notamember.html'

return render(
                request,
                self.template_name,
                {'classname': 'classname', 'secondvariable': 'variable' }
            )
0 голосов
/ 25 февраля 2019

Когда кажется, что все не работает, я использую return render и проверяю, является ли это пост-запросом, если кто-нибудь обновит страницу

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

Функция local () делает параметр доступным в шаблоне

...