2011-10-28 14 views
9

django.contrib.auth tiene una característica impresionante: cuando intenta acceder a una página decorada por login_required, se le redirige a la página de inicio de sesión con un argumento next , entonces, después de iniciar sesión, se le redirige a la página a la que originalmente intentaba acceder. Eso es bueno para el flujo de usuarios.Obteniendo `django-registration` para que lo envíe a la página que estaba tratando de visitar

Pero, aparentemente django-registration no proporciona una característica similar. Esperaba que si se registraba en lugar de iniciar sesión, también obtendría un next, y después de registrar-n'-activar sería redireccionado a la página que intentaba visitar originalmente. Este no es el caso, solo se te redirige a alguna página de éxito. Esto lastima el flujo.

¿Tal vez django-registration ofrecen esta opción pero no la estoy usando o no? ¿O hay una manera fácil de hacer esto?

+0

estás hablando WH ¿Usted hace el registro, o cuando se activa a través del correo electrónico? –

+0

Después de registrarse, se activa por correo electrónico y luego, cuando finaliza la activación, esperaría que lo redireccionaran a la página que intentaba visitar originalmente. –

Respuesta

12

Si nos fijamos en la vista responsable de la activación de una cuenta por correo electrónico (registration.views.activate) verás que acepta un parámetro success_url que es "El nombre de un patrón de URL para redirigir a la activación exitosa. "

Así que simplemente tiene que sobrescribir la url que llama a esa vista y proporcionar la página a la que desea redirigir.

Así que en su propia urls.py:

from registration.views import activate 
urlpatterns = patterns('', 
    url(r'^activate/(?P<activation_key>\w+)/$', 
      activate, 
      {'backend': 'registration.backends.default.DefaultBackend'}, 
      name='registration_activate', 
      # You could use reverse() here instead of a URL to be DRY'er 
      success_url = "http://..." 
      ), 

Como alternativa puede concluir django-registros Activar vista en su propio punto de vista y aceptar un parámetro GET para redirigir a:

from registration.view import activate 
def custom_activate(request, backend, 
     template_name='registration/activate.html', 
     success_url=None, extra_context=None, **kwargs): 
    success_url = request.GET.get('next', None) 
    return activate(request, template_name=template_name, success_url=success_url, extra_context=None, **kwargs) 

Ahora, en su plantilla registration/activation_email.html puede agregar la ubicación de redirección al enlace:

{% url 'registration.view.activate' activation_key as a_url %} 

Thanks! .... 

{% autoescape off %} 
<a href="http://{{ site.domain }}{{ a_url }}?next='http://somepage_or_url'"> 
    http://{{ site.domain }}{{ url_registration_activate }}/ 
</a> 
{% endautoescape %} 

Thanks! 

EDITAR

Ok, por lo que los anteriores se ocupa de redirecciones cifrados duros. Supongo que este es el flujo que desee:

  1. usuario intenta acceder a una página
  2. usuario se le redirecciona a una página de inicio de sesión/registro
  3. usuario se registra en esa página y se envía un correo electrónico
  4. usuario activa el correo electrónico y se le redirecciona a la página original se trató de ver

Esto es más difícil, ya que la página que estaban tratando de ver en el paso uno tiene que pasar todo el camino al paso cuatro, y como lo sabemos, HTTP es apátrida.

La primera sugerencia que me viene a la mente es guardar el redireccionamiento en una variable de sesión cuando se registra y luego recuperarlo cuando se activa.Para ello podemos sobrescribir django-registros default backend (que es sólo una clase con métodos que describen la funcionalidad del proceso de registro y se llaman desde el punto de vista), específicamente los métodos de registro y post_activation_redirect:

custom_backend.py

from registration.backends.default import DefaultBackend 
class RedirectBackend(DefaultBackend): 
    def register(self, request, **kwargs): 
     request.session['redirect'] = request.GET.get("next",None) 
     super(RedirectBackend, self).register(request, **kwargs) 

    def post_activation_redirect(self, request, user): 
     return(request.session['redirect'],(), {}) 

y para asegurarse de django-registro realmente utiliza este componente de fondo, que proporcionan a los puntos de vista a través de nuestra urls.py:

url(r'^activate/(?P<activation_key>\w+)/$', 
    activate, 
    {'backend': 'custombackend.RedirectBackend'}, 
    name='registration_activate'), 
url(r'^register/$', 
    register, 
    {'backend': 'custombackend.RedirectBackend'}, 
    name='registration_register'), 
+0

Esta es la segunda mitad. ¿Qué pasa con la primera mitad, conectando la URL correcta 'siguiente' con la persona que se registra? –

+0

No entiendo lo que quiere decir –

+0

El punto es redirigir a la vista que el usuario originalmente intentó visitar, no a una URL constante. Entonces, ¿cómo va a guardar y luego recuperar la URL que el usuario originalmente intentó visitar? –

-4

Debe usar el mismo decorador @login_required, django-registration también lo usa.

+0

¿Y eso provocará que el usuario sea redirigido después de registrarse en la página original que estaban tratando de visitar? –

Cuestiones relacionadas