You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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,提问作者امیرحمزه باقری

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 16:03:15