Obtención de `django-registration` para enviarte a la página que originalmente intentabas visitar

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

Pero, aparentemente django-registration no proporciona una característica similar. Esperaba que si te registras en lugar de iniciar sesión, también obtendrías una next cosa, y después de registrarte y activarlo, serás redirigido a la página que originalmente estabas intentando visitar. Este no es el caso, solo estás redirigido a una página de éxito. Esto duele el flujo.

¿Es posible que django-registration ofrezca esta opción pero no la estoy usando correctamente? ¿O hay una manera fácil de hacer esto?

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

Por lo tanto, simplemente debe sobrescribir la URL que llama a esa vista y proporcionar la página a la que desea redireccionar.

Así que en tus propios urls.py :

 from registration.views import activate urlpatterns = patterns('', url(r'^activate/(?P\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://..." ), 

De forma alternativa, podría cerrar la vista de activación de django-registrations en su propia 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 la plantilla de registro /ctivation_email.html puede agregar la ubicación de redirección al enlace:

 {% url 'registration.view.activate' activation_key as a_url %} Thanks! .... {% autoescape off %}  http://{{ site.domain }}{{ url_registration_activate }}/  {% endautoescape %} Thanks! 

EDITAR

Ok, entonces lo anterior trata con redireccionamientos codificados. Supongo que este es el flujo que quieres:

  1. El usuario intenta ir a una página
  2. El usuario es redirigido a una página de inicio de sesión / registro
  3. El usuario se registra en esa página y recibe un correo electrónico
  4. El usuario activa el correo electrónico y se redirige a la página original que intentó ver

Esto es más difícil ya que la página que intentaban ver en el paso uno debe pasar hasta el paso cuatro y, como sabemos, HTTP no tiene estado.

La primera sugerencia que viene a la mente es guardar el redireccionamiento en una variable de sesión cuando se registre y luego recuperarlo cuando lo active. Para hacer esto, podemos sobrescribir el backend predeterminado de django-registrations (que es solo una clase con métodos que describen la funcionalidad del proceso de registro y se llaman desde las vistas), específicamente los métodos register 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 asegurarnos de que django-registration realmente use este backend, lo proporcionamos a las vistas a través de urls.py:

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

Debería usar el mismo decorador @login_required, django-registration también lo utiliza.