Подтвердить что ты не робот

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? Большое спасибо!

4b9b3361

Ответ 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' }
            )