使用Django 4学习分页时遇TypeError:function类型对象无len()方法
Django分页功能报错:TypeError: object of type 'function' has no len()
在实现Django分页功能时,访问/blog/路径触发TypeError,报错信息为“object of type 'function' has no len()”。
错误根源
你的views.py存在一个明显的变量误用:创建Paginator实例时,传入的是视图函数本身post_list,而非之前查询得到的文章查询集posts。Paginator要求接收可计算长度的可迭代对象(如查询集、列表),函数对象不具备len()方法,因此触发报错。
修复视图代码
修改views.py中的分页初始化代码,将post_list替换为查询集变量posts:
from django.shortcuts import render, get_object_or_404 from django.http import Http404 from .models import Post from django.core.paginator import Paginator def post_list(request): posts = Post.published.all() # Pagination with 3 posts per page paginator = Paginator(posts, 3) # 此处将post_list改为posts page_number = request.GET.get('page', 1) posts = paginator.page(page_number) return render(request,'blog/post/list.html',{'posts': posts})
模板变量修正
你的paginations.html模板中使用的变量是page,但视图传递给模板的变量名为posts(这是一个Page对象),需要统一两者的变量名:
- 方案1:修改模板中所有
page为posts
<div class="pagination"> <span class="step-links"> {% if posts.has_previous %} <a href="?page={{ posts.previous_page_number }}">Previous</a> {% endif %} <span class="current"> <p>Page {{ posts.number }} of {{ posts.paginator.num_pages }}.</p> </span> {% if posts.has_next %} <a href="?page={{ posts.next_page_number }}">Next</a> {% endif %} </span> </div>
- 方案2:修改视图中传递的变量名为
page
return render(request,'blog/post/list.html',{'page': posts})
内容的提问来源于stack exchange,提问作者امیرحمزه باقری
相关产品推荐
相关产品推荐

