Home > Blockchain >  List Class View didn't return an HttpResponse
List Class View didn't return an HttpResponse

Time:01-24

I've been trying to get a class-based list view to display all entries under a user's account (applicant), but when loading the page I'm given the following error:

The view jobassessment.views.view didn't return an HttpResponse object. It returned None instead.

To me that sounds like the URL dispatcher isn't running the correct view, but this is my URL file for both the whole site and the jobassessment application and I can't seem to spot the fault.

Site URL.py:

urlpatterns = [
    path('admin/', admin.site.urls, name="admin"),
    path('accounts/', include('django.contrib.auth.urls'), name="accounts"),
    path('applicant/', include('userprofile.urls'), name="applicant"),
    path('assessments/', include('jobassessment.urls')),
]

JobAssessment App's URL.py:

from django.urls import path
from . import views

urlpatterns = [
    path("", views.AssessmentListView.as_view(), name="assessment"),
]

This is my ListView that is called:

class AssessmentListView(LoginRequiredMixin, generic.ListView):
    model = Assessment
    template_name ='assessments_index.html'
    paginate_by = 5
    def get(self, request, *args, **kwargs):
        # Ensure they have first created an Applicant Profile
        if not Applicant.objects.filter(user=self.request.user).exists():
            messages.info(request, "You must create a profile before you can view any assessments.")
            return redirect('profile_create_form') 

    def get_queryset(self):
        return Assessment.objects.all().filter(applicant=Applicant.objects.filter(user=self.request.user)).order_by('-assessment_stage')

CodePudding user response:

If Applicant of current login user not exists then your if condition fails and since there is no else part in there so there is no HttpResponse returned from the view. So please add else part if applicant exists and return HttpResponse()

class AssessmentListView(LoginRequiredMixin, generic.ListView):
        model = Assessment
        template_name ='assessments_index.html'
        paginate_by = 5
        def get(self, request, *args, **kwargs):
            # Ensure they have first created an Applicant Profile
            if not Applicant.objects.filter(user=self.request.user).exists():
                messages.info(request, "You must create a profile before you can view any assessments.")
                return redirect('profile_create_form')
            else:
                return HttpResponse()  #<------ add corresponding HttpResponse if Applicant exists.

        def get_queryset(self):
            return Assessment.objects.all().filter(applicant=Applicant.objects.filter(user=self.request.user)).order_by('-assessment_stage')

CodePudding user response:

Following the django document on ListView filter it's better to handle it within get_queryset. So for your case it would be something like this:

class AssessmentListView(LoginRequiredMixin, generic.ListView):
    model = Assessment
    template_name ='assessments_index.html'
    paginate_by = 5

    def get_queryset(self):
        # Ensure they have first created an Applicant Profile
        if not Applicant.objects.filter(user=self.request.user).exists():
            messages.info(request, "You must create a profile before you can view any assessments.")
            return redirect('profile_create_form') 
        else:
            return Assessment.objects.all().filter(applicant=Applicant.objects.filter(user=self.request.user)).order_by('-assessment_stage')
  •  Tags:  
  • Related