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

TypeError报错解决:TodoListServices.list_todo_paginate()缺少必填参数page

问题分析

错误TypeError at / TodoListServices.list_todo_paginate() missing 1 required positional argument: 'page'的核心原因是:调用list_todo_paginate方法时,存在未传入必填参数page的场景,或是参数传递逻辑存在漏洞。

解决办法

1. 给服务方法的page参数设置默认值

修改TodoListServices中的方法,让page参数变为可选(默认值设为None),同时增加参数类型校验,避免非整数页码导致的后续错误:

class TodoListServices:
    @staticmethod
    def list_todo_paginate(page=None):
        # 处理页码默认值与类型转换
        try:
            page_number = int(page) if page is not None else 1
            page_number = max(page_number, 1)  # 确保页码不小于1
        except (ValueError, TypeError):
            page_number = 1
        
        page_size = 10
        # 注意:模型类名建议大写(如Todo),符合Python编码规范
        todos = Todo.objects.all()[
                (page_number - 1) * page_size: page_number * page_size
                ]
        return todos

2. 修正视图中page参数的获取逻辑(更符合RESTful规范)

分页参数通常通过查询参数(如?page=2)传递,而非路径参数。修改视图代码,从request.query_params中获取页码,并处理异常情况:

class TodoList(APIView):
    def get(self, request, format=None):
        page = request.query_params.get('page')
        try:
            page_number = int(page) if page else 1
            page_number = max(page_number, 1)
        except ValueError:
            page_number = 1
        
        todos = TodoListServices.list_todo_paginate(page_number)
        serializer = TodoSerializer(todos, many=True, context={'request': request})
        return Response(serializer.data, status=status.HTTP_200_OK)

3. 若坚持使用路径参数,需修正URL路由配置

如果要通过路径传递页码(如/todos/2/),需在URL配置中添加page的捕获组:

# urls.py
from django.urls import path
from .views import TodoList

urlpatterns = [
    path('todos/', TodoList.as_view(), name='todo-list'),
    path('todos/<int:page>/', TodoList.as_view(), name='todo-list-paginated'),
]
额外优化建议

手动切片实现分页的方式不够健壮,推荐使用Django内置的Paginator类,它会自动处理页码超出范围等边界情况:

from django.core.paginator import Paginator

class TodoListServices:
    @staticmethod
    def list_todo_paginate(page=None):
        try:
            page_number = int(page) if page is not None else 1
            page_number = max(page_number, 1)
        except (ValueError, TypeError):
            page_number = 1
        
        paginator = Paginator(Todo.objects.all(), 10)
        # 自动处理页码超出范围的情况,返回有效页码的结果
        todos = paginator.get_page(page_number)
        return todos

内容的提问来源于stack exchange,提问作者Sujar Hada

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:16:19