urls tutorial template examples bootstrap python django

python - tutorial - Django: redirige a la página anterior después de iniciar sesión



django views (9)

Intento crear un sitio web simple con una funcionalidad de inicio de sesión muy similar a la aquí en SO. El usuario debería poder navegar por el sitio como un 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 regresar a la página desde donde hizo clic en el enlace de inicio de sesión. 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 conecté al formulario de inicio de sesión al pasar la página actual como un parámetro GET y luego utilicé ''next'' para redireccionar a esa página. ¡Gracias!

EDIT 2: Mi explicación no parece estar clara, así que como solicité aquí está mi código: Digamos que estamos en una página foo.html y no estamos conectados. Ahora nos gustaría tener un enlace en foo.html que enlaces para iniciar sesión.html. Allí podemos iniciar sesión y luego ser redirigidos 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 más o menos, espero que eso lo aclare.


Consulte los documentos de django para views.login() , proporcione un valor ''siguiente'' (como un campo oculto) en el formulario de entrada para redirigir a después de un inicio de sesión exitoso.


En registration/login.html (anidado dentro de templates carpeta de templates ) si inserta la siguiente línea, la página se mostrará como la página de inicio de sesión de administración original de Django:

{% include "admin/login.html" %}

Nota: El archivo debe contener solo las líneas anteriores.


Esto puede no ser una "mejor práctica", pero lo he usado con éxito antes:

return HttpResponseRedirect(request.META.get(''HTTP_REFERER'',''/''))



Me conecté al formulario de inicio de sesión al pasar la página actual como un parámetro GET y luego utilicé ''next'' para redireccionar a esa página. ¡Gracias!


Me encontré con el mismo problema. Esta solución me permite seguir usando la vista de inicio de sesión genérica:

urlpatterns += patterns(''django.views.generic.simple'', (r''^accounts/profile/$'', ''redirect_to'', {''url'': ''generic_account_url''}), )


No necesita hacer una vista adicional para esto, la funcionalidad ya está incorporada.

En primer lugar, cada página con un enlace de inicio de sesión necesita conocer la ruta actual, y la forma más fácil es agregar el preprosessor de contexto de solicitud a settings.py (los 4 primeros son predeterminados), luego el objeto de solicitud estará disponible en cada solicitud:

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = ( "django.core.context_processors.auth", "django.core.context_processors.debug", "django.core.context_processors.i18n", "django.core.context_processors.media", "django.core.context_processors.request", )

A continuación, agregue la plantilla que desea para el enlace de inicio de sesión:

base.html:

<a href="{% url django.contrib.auth.views.login %}?next={{request.path}}">Login</a>

Esto agregará un argumento GET a la página de inicio de sesión que apunta a la página actual.

La plantilla de inicio de sesión puede ser tan simple como esto:

registration / login.html:

{% block content %} <form method="post" action=""> {{form.as_p}} <input type="submit" value="Login"> </form> {% endblock %}


Para admitir URL completas con param / valores que necesitaría:

?next={{ request.get_full_path|urlencode }}

en lugar de simplemente

?next={{ request.path }}


También puedes hacer esto

<input type="hidden" name="text" value="{% url ''dashboard'' %}" />