django LOGIN_REDIRECT_URL con valor dinámico
-
05-07-2019 - |
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?
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
<*>