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

Django ListView获取GET请求参数报错:module 'django.http.request'无属性

问题原因

  1. 导入对象错误:你代码里from django.http import request导入的是django.http.request模块,不是用户请求的实例对象,模块本身不存在method、GET这类运行时才有的请求属性,所以抛出属性不存在的错误。
  2. 代码执行时机错误:你把读取请求参数的逻辑直接写在了类的属性定义区域,这部分代码会在项目启动、模块导入时就执行,此时还没有收到任何用户请求,根本没有可用的请求对象,自然无法读取参数。

正确实现逻辑

Django的通用类视图在处理请求时,会自动将当前请求实例挂载到视图实例的self.request属性上,你需要在类的实例方法中读取请求参数,动态调整分页配置:

  • 可以在get_context_data方法中读取self.request.GET里的每页条数参数,修改self.paginate_by的值,同时把参数传递到模板中,拼接在分页跳转链接上,避免切换页码时丢失每页条数的设置,就是你后续附上的解决方案的写法。
  • 也可以重写get_paginate_by方法直接返回动态的每页条数,逻辑会更简洁:
def get_paginate_by(self, queryset):
    return self.request.GET.get('shoespp', 2)

附完整解决方案(原提问者提供)

views.py代码

from django.views.generic import ListView
from .models import Shoes

class ShoeListView(ListView):
    model = Shoes
    template_name = 'shoes/shoes-list.html'
    context_object_name = 'shoes'
    paginate_by = 2 # 默认每页2条

    def get_context_data(self, **kwargs):
        if 'shoespp' in self.request.GET:
            self.paginate_by = self.request.GET.get('shoespp', 2)
        context = super().get_context_data(**kwargs)
        context['last_shoespp'] = self.request.GET.get('shoespp')
        return context

模板代码

<!DOCTYPE html>
<html lang="en-au">
<head>
    <title>Shoes List</title>
</head>
<body>
    <h1>Shoes</h1>
    <h2>List of Shoes</h2>
    <form method="GET">
        <select name="shoespp">
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
        </select>
        <input type="submit" value="List Shoes">
    </form>

    <ul>
        {%for pair in shoes %}
        <li>
            <strong>{{ pair }} <em>{{ pair.brand }}</em></strong> <em>{{ pair.colorway }}</em> - {{ pair.size }}
        </li>
        {% endfor %}
    </ul>

    <p>
        {% if page_obj.has_previous %}
        <a href="?page=1{% if last_shoespp %}&shoespp={{ last_shoespp }}{% endif %}">
            <button>&laquo; first</button>
        </a>
        <a href="?page={{ page_obj.previous_page_number }}{% if last_shoespp %}&shoespp={{ last_shoespp }}{% endif %}">
            <button>previous</button>
        </a>
        {% endif %}

        <span>
            Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
        </span>

        {% if page_obj.has_next %}
        <a href="?page={{ page_obj.next_page_number }}{% if last_shoespp %}&shoespp={{ last_shoespp }}{% endif %}">
            <button>next</button>
        </a>
        <a href="?page={{ page_obj.paginator.num_pages }}{% if last_shoespp %}&shoespp={{ last_shoespp }}{% endif %}">
            <button>last &raquo;</button>
        </a>
        {% endif %}
    </p>
</body>
</html>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 10:06:02