Estoy tratando de construir un sitio web simple con una funcionalidad de inicio de sesión muy similar a la de SO en SO. El usuario debe poder navegar por el sitio como usuario anónimo y habrá un enlace de inicio de sesión en cada página. Al hacer clic en el enlace de inicio de sesión, el usuario será llevado al formulario de inicio de sesión. Después de un inicio de sesión exitoso, el usuario debe volver a la página desde donde hizo clic en el enlace de inicio de sesión en primer lugar. Supongo que tengo que pasar de alguna manera la URL de la página actual a la vista que maneja el formulario de inicio de sesión, pero realmente no puedo hacer que funcione.
EDITAR: lo descubrí. Me vinculé al formulario de inicio de sesión pasando la página actual como un parámetro GET y luego usé 'siguiente' para redirigir a esa página. ¡Gracias!
EDITAR 2: Mi explicación no parecía ser clara, por lo que, según lo solicitado, aquí está mi código: Digamos que estamos en una página foo.html y no hemos iniciado sesión. Ahora nos gustaría tener un enlace en foo.html que vincule para iniciar sesión.html. Allí podemos iniciar sesión y luego se nos redirige a foo.html. El enlace en foo.html se ve así:
<a href='/login/?next={{ request.path }}'>Login</a>
Ahora escribí una vista de inicio de sesión personalizada que se parece a esto:
def login_view(request):
redirect_to = request.REQUEST.get('next', '')
if request.method=='POST':
#create login form...
if valid login credentials have been entered:
return HttpResponseRedirect(redirect_to)
#...
return render_to_response('login.html', locals())
Y la línea importante en login.html:
<form method="post" action="./?next={{ redirect_to }}">
Así que sí, eso es todo, espero que quede claro.
Respuestas:
No necesita hacer una vista adicional para esto, la funcionalidad ya está integrada.
Primero, cada página con un enlace de inicio de sesión debe conocer la ruta actual, y la forma más fácil es agregar el preprocesador de contexto de solicitud a settings.py (los 4 primeros son predeterminados), luego el objeto de solicitud estará disponible en cada solicitud:
settings.py:
Luego agregue en la plantilla que desea el enlace de inicio de sesión:
base.html:
Esto agregará un argumento GET a la página de inicio de sesión que apunta de nuevo a la página actual.
La plantilla de inicio de sesión puede ser tan simple como esta:
registro / login.html:
fuente
request.path
es nula, así que lo hago de{% firstof request.path '/' %}
esa manera si la ruta de solicitud no está disponible por alguna razón, el usuario es enviado a la página de inicio.<a href="{% url auth_login %}?next={% firstof request.path '/' %}">Login</a>
lugar.next
sería algo así/accounts/logout/
y después de que el usuario inicie sesión, inmediatamente se cerrará la sesión jajaja, y el ciclo continúa.Puede que esto no sea una "mejor práctica", pero lo he usado con éxito antes:
fuente
Para admitir URL completas con parámetros / valores que necesitaría:
en lugar de solo:
fuente
La autenticación incorporada de Django funciona de la manera que desee.
Sus páginas de inicio de sesión incluyen una
next
cadena de consulta que es la página a la que volverá después del inicio de sesión.Mire http://docs.djangoproject.com/en/dev/topics/auth/#django.contrib.auth.decorators.login_required
fuente
Me vinculé al formulario de inicio de sesión pasando la página actual como un parámetro GET y luego usé 'siguiente' para redirigir a esa página. ¡Gracias!
fuente
Encontré el mismo problema. Esta solución me permite seguir usando la vista de inicio de sesión genérica:
fuente
En
registration/login.html
(anidado dentro de latemplates
carpeta) si inserta la siguiente línea, la página se representará como la página de inicio de sesión de administrador original de Django:Nota: El archivo debe contener solo las líneas anteriores.
fuente
Vea los documentos de django para views.login () , usted proporciona un valor 'siguiente' (como campo oculto) en el formulario de entrada para redirigir después de un inicio de sesión exitoso.
fuente
También puedes hacer esto
fuente