[Django]-Can I redirect to another url in a django TemplateView?

50πŸ‘

I know this question is old, but I’ve just done this myself. A reason you may think you want to do it in get_context_data is due to business logic, but you should place it in dispatch.

def dispatch(self, request, *args, **kwargs):
    if not request.user.is_authenticated:
        return redirect('home')

    return super().dispatch(request, *args, **kwargs)

Keep your business logic in your dispatch and you should be golden.

15πŸ‘

Why only get_context_data?

Just set up your get handler to do a redirect if necessary.

def get(self, request, lang):
    if lang == 'fr':
         return http.HttpResponseRedirect('../en')

     return super(MyTemplateView, self).get(request, lang)

2πŸ‘

A note from the future: it’s now possible and probably simpler just to use RedirectView.

1πŸ‘

This worked for me using an UpdateView class in Django 3.1:

def get(self, request, *args, **kwargs):
   
    if 1 == 1:
        return HttpResponseRedirect(reverse_lazy("view_name_here"))
    else:
        return super().get(request, *args, **kwargs)

To determine this, I analyzed its base class (Cmd+Click in PyCharm), where I found the base method:

def get(self, request, *args, **kwargs):
    self.object = self.get_object()
    return super().get(request, *args, **kwargs)

You can find this and other methods in the Django source code: django/views/generic/edit.py

Leave a comment