Frage

Ich versuche, einen Benutzer zu einer URL enthalten, seinen Benutzernamen zu umleiten (wie http: // domain / Benutzername / ), und zu versuchen, herauszufinden, wie dies zu tun. Ich verwende django.contrib.auth für meine Benutzerverwaltung, also habe ich LOGIN_REDIRECT_URL in den Einstellungen versucht mit:

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

, aber es scheint nur feste Strings zu akzeptieren, anstatt etwas, das bestimmt würde, nachdem der Benutzer angemeldet ist. Wie kann ich das noch erreichen?

War es hilfreich?

Lösung

Eine Lösung ist auf eine statische Route wie ‚/ Benutzerseite /‘ zu umleiten und haben diese auf die endgültige dynamische Seite umgeleitet werden.

Aber ich denke, die wirkliche Lösung ist eine neue Ansicht zu machen, die das tut, was Sie wirklich wollen.

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 / Themen / auth / # Authentifizierungs-in-Web-Anfragen

Weitere Informationen über die Ansicht neu zu schreiben. Dies ist, wie die docs sagen, diese Art der Sache außer Kraft zu setzen.

Andere Tipps

Wickeln Sie die Auth-Ansicht in Ihrer eigenen benutzerdefinierten Ansicht und Umleitung zu, wo immer Sie wollen, wenn die Authentifizierung erfolgreich ist.

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

Eine weitere Alternative ist die Abfrage param next zu verwenden, um anzuzeigen, wo man nach dem Login umleiten.

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

Mit dem klassenbasierten django.contrib.auth.views.LoginView, können Sie jetzt einfach get_success_url außer Kraft setzen:

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])
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top