Django LOGIN перенаправление URL с динамическим значением

Я пытаюсь перенаправить пользователя на URL-адрес, содержащий имя пользователя (например,http://domain/username/), и пытается выяснить, как это сделать. Я использую django.ВНО.auth для моего управления пользователями, поэтому я попытался использовать LOGIN_REDIRECT_URL в настройках:

LOGIN_REDIRECT_URL = '/%s/' % request.user.username # <--- fail..

но, похоже, он принимает только фиксированные строки, а не то, что будет определено после входа пользователя в систему. Как я могу это сделать?

3 ответов


решением является перенаправление на статический маршрут, например " / userpage/", и перенаправление на конечную динамическую страницу.

но я думаю, что реальное решение-сделать новый вид, который делает то, что вы действительно хотите.

from django.contrib.auth import authenticate, login
from django.http import HttpResponseRedirect

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            HttpResponseRedirect('/%s/'%username) 
        else:
            # Return a 'disabled account' error message
    else:
        # Return an 'invalid login' error message.

http://docs.djangoproject.com/en/dev/topics/auth/#authentication-in-web-requests

дополнительные сведения о перезаписи представления. Вот как говорят врачи, чтобы переопределить такого рода вещи.


оберните представление auth в свой собственный пользовательский вид и перенаправьте туда, куда вы хотите, если аутентификация прошла успешно.

from django.http import HttpResponseRedirect
from django.contrib import auth
from django.core.urlresolvers import reverse

def login(request):
    template_response = auth.views.login(request)

    if isinstance(template_response, HttpResponseRedirect) and template_response.url == '/accounts/profile/':
        return HttpResponseRedirect(reverse('user', args=(request.user.username,)))


    return template_response

Другой альтернативой является использование запроса param next чтобы указать, куда перенаправить после входа в систему.

<a href="{% url 'login' %}?next={{ request.path }}">sign in</a>

С классом на основе django.contrib.auth.views.LoginView, теперь вы можете просто переопределить get_success_url:

urls.py:

url(r'^login$', MyLoginView.as_view(), name='login'),
url(r'^users/(?P<username>[a-zA-Z0-9]+)$', MyAccountView.as_view(), name='my_account'),

views.py

class MyLoginView(LoginView):

    def get_success_url(self):
        return reverse('my_account', args=[self.request.user.username])