Django возвращает HttpResponseRedirect к URL-адресу с параметром
У меня есть ситуация в моем проекте, где мне нужно сделать перенаправление пользователя на url, содержащий параметр (он объявлен в urls.py, например:
url(r'^notamember/(?P<classname>\w+)/$',
notamember,
name='notamember'),)
Как я могу поместить этот параметр в возвращаемый HttpResponseRedirect? Я пробовал:
return 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?
Большое спасибо!
Ответы
Ответ 1
Попробуйте следующее:
return HttpResponseRedirect('/classroom/notamember/%s/' % classname)
EDIT:
Это, безусловно, лучше (Даниэль Роземан отвечает):
from django.core.urlresolvers import reverse
url = reverse('notamember', kwargs={'classname': classname})
return HttpResponseRedirect(url)
Ответ 2
Это не должно быть сложно. Аргумент 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)
Ответ 3
Фактически, ярлык redirect
принимает имена имен и модели (которые также имеют имена get_absolute_url
).
from django.shortcuts import redirect
return redirect(leave_classroom)
Ответ 4
Когда кажется, что все не работает, я использую return render и проверяю, является ли это почтовым запросом, если кто-нибудь обновит страницу
if request.POST:
message = "Thank you."
return render(request, 'index.html', locals())
return HttpResponseRedirect('/')
Функция local() делает параметр доступным в шаблоне
Ответ 5
Если вы отправляете на тот же URL, вы можете использовать следующее для передачи параметров.
template_name = '/classroom/notamember.html'
return render(
request,
self.template_name,
{'classname': 'classname', 'secondvariable': 'variable' }
)