Redirect / return to same (previous) page in Django?

DjangoDjango Views

Django Problem Overview


What are the options when you want to return the user to the same page in Django and what are the pros/cons of each?

Methods I know:

  • HTTP_REFERER
  • GET parameter containing the previous URL
  • Session data to store the previous URL

Are there any other?

Django Solutions


Solution 1 - Django

One of the way is using HTTP_REFERER header like as below:

from django.http import HttpResponseRedirect

def someview(request):
   ...
   return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

Not sure of cons of this!

Solution 2 - Django

100% working Example

For Class Based View and Function:

from django.http import HttpResponseRedirect
    ...
    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

or

from django.http import HttpResponseRedirect
    ...
    return HttpResponseRedirect(self.request.META.get('HTTP_REFERER'))

Example -

class TaskNotificationReadAllView(generic.View):
    
    def get(self, request, *args, **kwargs):
        TaskNotification.objects.filter(assigned_to=request.user).update(read=True)   
        print(request.META.get('HTTP_REFERER'))    
        return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

Solution 3 - Django

While the question and answer is old, I think it's lacking a few options. I have not find any cons with the methods, I would be happy to know if there are any?

Solution 4 - Django

In django view suppose you are not logged in but click on some content that content trigger some url like /board/2/new_topic then @login_required will redirect you to login page with this url

http://localhost:8000/signin/?next=/boards/2/new_topic/

so our aim is redirect to http://localhost:8000/boards/2/new_topic/ page after successful login so one line we will have to add

  if 'next' in request.GET:
        return redirect(request.GET['next'])

then if it next is there then it will redirect according to that other normal redirect .

Views.py :

def signin(request):
if request.method == "POST":
    user_login_form = UserLoginForm(request.POST)
    email = request.POST['email']
    password = request.POST['password']
    user = authenticate(request, email=email, password=password)
    if user and user.is_active:
        login(request, user)
        if 'next' in request.GET:
            return redirect(request.GET['next'])
        else:
            return redirect('home')
    else:
        return render(request, 'signin.html', context={'form': user_login_form})
else:
    user_login_form = UserLoginForm()
    return render(request, 'signin.html', context={'form': user_login_form})

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAl BundyView Question on Stackoverflow
Solution 1 - DjangoRohanView Answer on Stackoverflow
Solution 2 - DjangoCipherView Answer on Stackoverflow
Solution 3 - DjangoDaniel BackmanView Answer on Stackoverflow
Solution 4 - Djangoabhishek SinghView Answer on Stackoverflow