Pregunta

Estoy tratando de redirigir a un usuario a una url que contiene su nombre de usuario (como http: // domain / username / ), y tratando de averiguar cómo hacer esto. Estoy usando django.contrib.auth para mi administración de usuarios, así que he intentado usar LOGIN_REDIRECT_URL en la configuración:

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

pero solo parece aceptar cadenas fijas, en lugar de algo que se determinará después de que el usuario haya iniciado sesión. ¿Cómo puedo lograr esto?

¿Fue útil?

Solución

Una solución es redirigir a una ruta estática como '/ userpage /' y redirigir a la página dinámica final.

Pero creo que la solución real es crear una nueva vista que haga lo que realmente quieres.

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 / es / dev / topics / auth / # autenticación en las solicitudes web

para obtener más información sobre cómo reescribir la vista. Así es como dicen los documentos para anular este tipo de cosas.

Otros consejos

Envuelva la vista de autenticación en su propia vista personalizada y redirija a donde desee si la autenticación se realizó correctamente.

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

Otra alternativa es usar el parámetro de consulta next para indicar a dónde redirigir después del inicio de sesión.

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

Con el django.contrib.auth.views.LoginView basado en clase, ahora puede simplemente anular get_success_url :

urls.py:

url(r'^login

vistas.py

class MyLoginView(LoginView):

    def get_success_url(self):
        return reverse('my_account', args=[self.request.user.username])
, MyLoginView.as_view(), name='login'), url(r'^users/(?P<username>[a-zA-Z0-9]+)

vistas.py

<*>, MyAccountView.as_view(), name='my_account'),

vistas.py

<*>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top