Django ListView获取GET请求参数报错:module 'django.http.request'无属性
问题原因
- 导入对象错误:你代码里
from django.http import request导入的是django.http.request模块,不是用户请求的实例对象,模块本身不存在method、GET这类运行时才有的请求属性,所以抛出属性不存在的错误。 - 代码执行时机错误:你把读取请求参数的逻辑直接写在了类的属性定义区域,这部分代码会在项目启动、模块导入时就执行,此时还没有收到任何用户请求,根本没有可用的请求对象,自然无法读取参数。
正确实现逻辑
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>« 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 »</button> </a> {% endif %} </p> </body> </html>
内容的提问来源于stack exchange,提问作者PJay_D
相关产品推荐
相关产品推荐

