Home > database >  How to solve "object of type 'Course' has no len()" error that I am getting afte
How to solve "object of type 'Course' has no len()" error that I am getting afte

Time:01-06

This is my model. I have a many to one relationship.

class Course(models.Model):
    course_name = models.CharField(max_length=100)

class Coursegk(models.Model):
    question = models.CharField(max_length=1000)
    option_one = models.CharField(max_length=100)
    option_two = models.CharField(max_length=100)
    option_three = models.CharField(max_length=100)
    option_four = models.CharField(max_length=100)
    answer = models.CharField(max_length=100)
    courses = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="display")

This is my views.py page

def showcourses(request):
    details = Course.objects.all()
    paginator = Paginator(details, 2)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'index.html', {'data':page_obj})


def displaymcqpage(request, courses_id):
    displaymcq = Course.objects.get(id=courses_id)
    paginator = Paginator(displaymcq, 2)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'coursegk.html', {'display':page_obj})

Now paginator is working fine for the index.html page. But when I go to coursegk.html page from index.html page I am getting "object of type 'Course' has no len()" error. How to use paginator for the displaymcqpage function?

CodePudding user response:

How to use paginator for the displaymcqpage function?

You don't. This is a detail view: you are showing details for a single Course object. Pagination means that you have a collection of objects, and you show a subset of these, but here there is a single Course determined by the courses_id parameter, hence pagination makes no sense.

You can paginate the Coursegk objects related to that Course with:

def displaymcqpage(request, courses_id):
    displaymcq = Course.objects.get(id=courses_id)
    paginator = Paginator(displaymcq.display.all(), 2)
    page_number = request.GET.get('page')
    page_obj = paginator.get_page(page_number)
    return render(request, 'coursegk.html', {'dta': displaymcq, 'coursegks': page_obj})

and here we thus paginate the related Coursegk objects, but then we do not paginate the Course records.


Note: It is often better to use get_object_or_404(…) [Django-doc], then to use .get(…) [Django-doc] directly. In case the object does not exists, for example because the user altered the URL themselves, the get_object_or_404(…) will result in returning a HTTP 404 Not Found response, whereas using .get(…) will result in a HTTP 500 Server Error.

  •  Tags:  
  • Related