Search code examples
ajaxdjangodjango-viewsdjango-generic-views

Overriding generic.ListView methods for AJAX requests DJANGO


I recently started using django's inbuilt generic views (Create, Update, etc) So I'm updating most of my old views to use them, one of them is the ListView, with pagination. So now, it works right,when i GET that page, it displays the objects as directed, and the pagination works fine. But i want to use AJAX on the pagination so that i just click a "More" button and it gets the next page's objects via ajax and are appended onto the end of the . So i've modified some generic views before to incorporate AJAX like the:

class Delete(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
   login_url = LOGIN_URL
   model = Items
   success_url = reverse_lazy('web:member-area')

   def test_func(self):
      return not self.request.user.is_superuser and self.get_object().created_by == self.request.user

   def delete(self, request, *args, **kwargs):
      response = super().delete(request)
      if self.request.is_ajax():
          return JsonResponse({'success': 1}, status=200)
      else:
          return response

In the above snippet you can see i included the part where it returns something different if the request is AJAX

The current View that i'm working on is as follows:

class Items(ListView):
   model = Items
   paginate_by = 5
   context_object_name = 'items'
   template_name = 'web/items/index.html'

which works fine on normal GET requests, so the problem is i dont know which super() method(s) to override and return a different response if its AJAX on that ListView


Solution

  • Use dispatch

    class Items(ListView):   
          def dispatch(request, *args, **kwargs):
                 response = super().dispatch(request, *args, **kwargs)
                 if request.is_ajax():              
                    return JsonResponse({'success': 1}, status=200)
                 else:
                    return response