1

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?

1 Answers1

0

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.

Willem Van Onsem
  • 443,496
  • 30
  • 428
  • 555
  • I have a collection of questions for each course. And I want to show only two questions per page. For that I need pagination. How to do it? – Pogba pogba Jan 05 '22 at 19:09
  • @Pogbapogba: then you paginate the queryset of the related objects, as is specified in the second paragraph. – Willem Van Onsem Jan 05 '22 at 19:10