Django и urls.py: Как я могу HttpResponseRedirect через именованный URL? - PullRequest
24 голосов
/ 30 июля 2009

Я пишу основанное на членах веб-приложение, и мне нужно иметь возможность перенаправить страницу после входа в систему. Я хочу использовать именованный URL из моего скрипта urls.py в моем файле views.py для приложения входа в систему, но я не могу понять, что делать. Что у меня есть это:

def login(request): 
if request.session.has_key('user'):
    if request.session['user'] is not None:
        return HttpResponseRedirect('/path/to/page.html')

То, чего я хочу достичь, это что-то вроде:

def login(request): 
if request.session.has_key('user'):
    if request.session['user'] is not None:
        return HttpResponseRedirect url pageName

При выполнении этого я получаю синтаксические ошибки, есть идеи?

Ответы [ 4 ]

41 голосов
/ 30 июля 2009

Вам необходимо использовать функцию reverse().

from django.urls import reverse
# or Django < 2.0 : from django.core.urlresolvers import reverse

def myview(request):
    return HttpResponseRedirect(reverse('arch-summary', args=[1945]))

Где args удовлетворяет всем аргументам в регулярном выражении вашего URL. Вы также можете предоставить именованные аргументы, передав словарь.

13 голосов
/ 25 июля 2014

Правильный ответ от Django 1.3 и далее , где метод перенаправления неявно выполняет обратный вызов, таков:

from django.shortcuts import redirect

def login(request):
    if request.session.get('user'):
        return redirect('named_url')
7 голосов
/ 31 июля 2009

Более краткий способ написать, что оператор if будет if request.session.get('user'). has_key устарел в наше время, и .get () возвращает None (по умолчанию, можно изменить, передав второй параметр). Так что в сочетании с ответом Совиута:

from django.core.urlresolvers import reverse

def login(request): 
    if request.session.get('user'):
         return HttpResponseRedirect(reverse('my-named-url'))
3 голосов
/ 19 мая 2014
from django.core.urlresolvers import reverse
from django.shortcuts import redirect

def login(request):
    if request.session.get('user'):
        return redirect(reverse('name-of-url'))

Также см. https://docs.djangoproject.com/en/dev/topics/http/urls/#reverse-resolution-of-urls

...