Question

If i user is not logged in and encounters a @login_required decorator, it will be send to my login_user view. after login it will be send to my index. how can I my redirect to the previous page.

def login_user(request):
    login_form = LoginForm(request.POST or None)
    if request.POST and login_form.is_valid():
        user = login_form.login(request)
        if user:
            login(request, user)
            if request.POST['next'] != "":
                return HttpResponseRedirect(request.POST['next'])
            else:
                return HttpResponseRedirect(reverse('index'))

    #return render(request, 'login.html', {'login_form': login_form })
    return render_to_response('login.html', {'login_form': login_form}, context_instance=RequestContext(request))

now i have been looking at: Django: Redirect to previous page after login But I'm not sure how to use this, since I don't sent them to login with a link but with a decorator

Was it helpful?

Solution

the login_required decorator annotates the login-url adding a next field to the GET parameters. see login_required.

e.g. if LOGIN_URL is /login it becomes /login?next=/polls/3/vote

This gets passed to your login view, where you use it

  1. To render the login page upon GET or errorneos POST in a request aware manner. Please note that you need to pass the request variables to the template rendercontext. see RequestContext and render_to_response.

    return render_to_response(
            'login.html',
            my_data_dictionary,
            context_instance=RequestContext(request)
    )
    
  2. in the template add a line like this to the login form

    <input type="hidden" name="next" value="{{ next }}">
    
  3. Finally upon a succesfull POST use this value to HttpResponseRedirect, either to the value of next or to LOGIN_REDIRECT_URL if no next value is present. see HttpResponseRedirect.

    ... user was succesfully authenticated...
    if request.POST["next"] is Not "":
        HttpResponseRedirect(request.POST["next"])
    else:
        HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
    

I hope this clarifies things a little bit.

OTHER TIPS

I got it to work doing the following:

def login_user(request):
    login_form = LoginForm(request.POST or None)

    if request.POST and login_form.is_valid():
        user = login_form.login(request)
        if user:
            login(request, user)
            return HttpResponseRedirect(request.POST.get('next', reverse('index')))

    return render(request, 'login.html', {'login_form': login_form, 'next': request.GET.get('next', '') })
    #return render_to_response('login.html', {'login_form': login_form, 'next': request.GET.get('next', '')}, context_instance=RequestContext(request))

also included

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

in my login.html login_form

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top