Pregunta

Tengo una visión que tiene el decorador @login_required y al tirar hacia arriba de la página, si no está en el sistema se le envía a la forma de la conexión con el correcto? Siguiente = / url / usted / tratado / a / ves

Mi problema es cómo me pase lo largo de esa? Siguiente valor a las formas posteriores y correo electrónico de activación de modo que cuando el usuario completa el proceso de activación se les redirige a la vista que inicialmente trataron de llegar.

Mi Python'foo y Django'foo es débil, así que por favor mantenga la respuesta a algo a 5 años podía seguir;)

Gracias a todos en avanzada.

¿Fue útil?

Solución

Es muy fácil, sólo tienes que guardar la URL y escribir su propio backend anulando 2 métodos.

cuentas / models.py

class UserNext(models.Model):
    user = models.OneToOneField(User)
    url = models.CharField(max_length=255, blank=True, null=True)

cuentas / nextbackend.py:

from registration.backends.default import DefaultBackend
from django.core.urlresolvers import resolve
from accounts.models import UserNext

class NextBackend(DefaultBackend):

    def register(self, request, **kwargs):
            username, email, password = kwargs['username'], kwargs['email'], kwargs['password1']
            if Site._meta.installed:
                site = Site.objects.get_current()
            else:
                site = RequestSite(request)
            new_user = RegistrationProfile.objects.create_inactive_user(username, email,
                                                                        password, site)
            signals.user_registered.send(sender=self.__class__,
                                         user=new_user,
                                         request=request)

            next, created = UserNext.objects.get_or_create(user=new_user)
            next.url = request.GET.get('next',None) # or POST, don't know how you want to pass it
            next.save()
            return new_user

    def post_activation_redirect(self, request, user):
        next = UserNext.objects.get(user=user)
        view, args, kwargs = resolve(next.url)
        return (view, args, kwargs)

usuario esta ^ back-end como su base de registro de cuentas / views.py:

def custom_register(request):
            return register(request, backend='accounts.nextbackend.NextBackend',)

urls.py:

url(r'^accounts/register/$', 'accounts.views.custom_register', name='registration_register'),

En caso de trabajar, no probó que, por escrito sobre la marcha. Obviamente, se necesita la adición de algunas importaciones.

Otros consejos

Construido en vista maneja esto por defecto. Asegúrate de que tienes esta pieza de código:. <input type="hidden" name="next" value="{{ next }}" /> en la plantilla de la página de inicio de sesión

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top