2010-08-09 10 views
25

Estoy intentando redirigir a los usuarios a la URL personalizada "/ gallery/(nombre de usuario) /" después de iniciar sesión con éxito. Actualmente redirige a la configuración predeterminada "/ cuenta/perfil/"Aunque sé lo que puedo anular la URL de redirección en mi settings.py, mi URL es dinámica, por lo que no funcionará.El parámetro "siguiente", redirigir, django.contrib.auth.login

La documentación indica que necesito utilizar el "próximo" parámetro y los procesadores de contexto. Tengo el {{next}} en mi plantilla, pero estoy confundido sobre cómo pasar realmente "/ gallery/(username)". Cualquier ayuda sería muy apreciada.

p.s Estoy intentando alejarme de escribir mi propia vista de inicio de sesión.

Respuesta

18

Confieso que suelo utilizar 2 redireccionamientos para hacer que algo así funcione.

Primero, haga su propia página registration/login.html. Puede copiar y pegar el ejemplo html en esta sección del authentication docs para facilitar el proceso. En lugar de utilizar el '{{ next }} variable dinámica del contexto, sin embargo, cablear el valor de la siguiente para ir a una vista de aterrizaje genérica de usuarios registrados

<input type="submit" value="login" /> 
<input type="hidden" name="next" value="/gallery/" /> 

A continuación, en la vista que asigne a la URL /gallery/, extraer el objeto de usuario de la solicitud (ya que el usuario ahora se registrará en, sobre todo si la vista la galería está envuelto en un decorador @permission_required o @login_required Use ese punto de vista para redirigir a la específica del usuario página de la galería apropiado:.

@login_required 
def gallery(request): 
    url = '/gallery/%s/' % request.user.username 
    return HttpResponseRedirect(url) 
+0

Diría que esto es un 'redireccionamiento' no dos, que se ejecuta en la vista de galería. Bonito. – Timo

0

cree su propia vista para iniciar sesión, con su propia URL, no use la del administrador. puede almacenar la siguiente página en la sesión, o pasarla como un parámetro GET a la vista de inicio de sesión (es decir,/login? Next = gallery) simplemente no se olvide de desinfectar y validar ese valor antes de redirigirlo.

+0

Realmente no quiero crear una vista de inicio de sesión personalizada, pero incluso si lo hice, su ejemplo no muestra cómo pasar el nombre de usuario. ¿Cómo se supone que "/ login? Next = gallery" redirigirá automáticamente a/gallery/username. ¿También dónde se supone que coloque "/ login? Next = gallery" dentro de la URLconf o dentro de la vista usando una expresión regular? –

+0

el nombre de usuario está disponible en los datos de la sesión. la parte de URLconf asigna '/ login' a su vista. la galería? siguiente = estará disponible en su vista en request.GET ['next'] – ozk

5

Si ya tiene la plantilla personalizada para el formulario de acceso es necesario agregar la siguiente dentro de la etiqueta <form>:

<input type="hidden" name="next" value="{{next}}" /> 

Por cierto, usted no tiene que crear su propio punto de vista de inicio de sesión. django.contrib.auth.views.login funciona bien. Solo necesita crear una plantilla (registration/login.html)

+1

Esto es exactamente cómo lo tengo configurado, pero dónde exactamente asigno el valor para "next". Y cómo especifico un valor dinámico para "siguiente". –

+0

Veo ahora, quiere un nombre de usuario en {{next}} y no lo sabe antes de enviar el formulario. En ese caso, debe crear su propia vista de inicio de sesión. Otra opción es usar un poco de Javascript para completar el campo 'siguiente' justo antes de enviar el formulario. –

+0

Hombre, pregunta no sobre qué. – Denis

2

Puede usar una redirección estática a /loggedin/ y luego asociar la url a una vista que hace la redirección correcta.

El inicio de sesión da un paso extra, pero si desea usar la vista de django, hace el trabajo.

37

Django's login view django.contrib.auth.views.login aceptar s un diccionario llamado extra_context. Los valores en el diccionario se pasan directamente a la plantilla. Entonces puede usar eso para establecer el parámetro next. Una vez hecho esto, puede establecer un campo oculto con el nombre next y el valor {{ next }} para que se represente en la plantilla.

+0

@ django-d Esto debería resolver su requisito como lo hizo con el mío – Guruprasad

+1

¡Hombre, rock! La tuya debe ser la respuesta aceptada. ¡Vota arriba! – Philip007

+0

intenté esto, pero me pareció que esto establecería estáticamente a continuación sin la posibilidad de anular desde una vista de referencia si es necesario. sin embargo, esto amplió en gran medida mi comprensión de cómo funciona django y podría ser un enfoque simple y directo, ¡gracias! – antiplex

4

siendo un novato en django y tropezando con este hilo algo más viejo encontré una solución diferente para el problema de dinámicamente (= anular un valor predeterminado personalizado solo si es necesario) configurando el siguiente parámetro que me gustaría compartir (trabajando bien con django 1.5, las versiones anteriores no probado):

tan django-d que quería evitar la repetición y un inicio de sesión-vista personalizada, así que utiliza el -view Stock django.contrib.auth.views.login añadiendo la línea de

url(r'^login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html',}, name='login'), 

a mis URL .py y dentro de la forma login.html-templates-elemento:

{% if not next or not next.strip %} 
    {# avoid django.contrib.auth.views.login s default of /account/profile/ #} 
    {% url 'afterlogindefaultview' as next %} 
{% endif %} 
<input type="hidden" name="next" value="{{ next }}" /> 

la que a mi entender sigue el desacoplamiento-práctica de la URL configuraciones desde los puntos de vista. modo de puntos de vista que se debe redirigir a mis aplicaciones de inicio de sesión y luego dirigirse a una vista no predeterminado yo uso

return HttpResponseRedirect('%s?next=%s' % (reverse('login'), reverse('mycustomnext'))) 

de la vista en la que quiero tener el usuario para iniciar sesión. Lo utilizo para volver a la vista donde lo dejé para registrar al usuario.

Cuestiones relacionadas