Django分页KeyError 'source
我从这个链接安装了Django的模板分页标签:https://github.com/jmcclell/django-bootstrap-pagination,虽然我按照所有的说明操作,但我遇到了“源”错误。
显然我做错了什么。
===========================================
编辑 3
设置文件 SETTINGS.py
TEMPLATE_CONTEXT_PROCESSORS = (
"django.contrib.auth.context_processors.auth",
"django.core.context_processors.request",
)
视图文件 VIEW.py:
def pagination(request):
location = Location.objects.all()
return render_to_response('pagination.html',
location,
context_instance=RequestContext(request))
模板文件 TEMPLATE
{% load bootstrap_pagination %}
<h1>Location</h1>
{% for location in location %}
<h2>{{ location.name }}</h2>
{% endfor %}
{% bootstrap_paginate location %}
错误信息:
AttributeError at /pagination/
'str' object has no attribute 'paginator'
Request Method: GET
Request URL: http://127.0.0.1:8000/pagination/
Django Version: 1.5.4
Exception Type: AttributeError
Exception Value:
'str' object has no attribute 'paginator'
模板渲染时出错
In template /home/jr/Documents/python/amapp/sdr/article/templates/pagination.html, error at line 7
'str' object has no attribute 'paginator'
1 {% load bootstrap_pagination %}
2
3
4
5
6
7 {% bootstrap_paginate location %}
3 个回答
使用 page_obj
对我来说是有效的,想知道为什么在使用 Django 2.0.2 和 django-bootstrap4 0.0.6 时这不管用的人可以看看。
我是在查看Django的DEBUG模式下出现的错误信息中的上下文变量时发现这个问题的。
你有没有按照所有步骤来做呢?
请求是在 context_processor(settings.py)里面吗?
TEMPLATE_CONTEXT_PROCESSORS = (
....
"django.core.context_processors.request",
....
)
你在模板中使用了 obj_list,但 obj_list 里面有东西吗?也许你应该用“location”而不是“obj_list”呢?因为我觉得你的对象列表是在 location 里面(Location 对象),但你却像例子那样使用 obj_list。在例子中,obj_list 只是一个对象列表的变量示例。
编辑: 把这个改成:
def pagination(request):
args = {}
args.update(csrf(request))
args['location'] = Location.objects.all()
return render_to_response('pagination.html', args)
改成这个:
from django.template import RequestContext
def pagination(request):
location = Location.objects.all()
return render_to_response('pagination.html', 'location':location,context_instance=RequestContext(request))
我是这个库的作者,不过请原谅我,因为我有一段时间没用Python了,关于这个库的知识也几乎忘光了。
所以,@WayBehind说得对,你的第一个错误是使用了“page_obj”。那只是个例子。在你的情况下,你应该用“location”。
不过,你并没有看到那个错误,因为你遇到了一个更严重的问题,就是这个库和你的环境不兼容。我是在Python 2.7下写的这个库,并且使用了请求上下文预处理器。请仔细检查一下你是否按照文档启用了上下文预处理器,并确保你使用的是Python <3.0。我知道这个库在3.x版本上是无法工作的。目前有一个分支,其他人正在努力修复这个问题,我也在关注这个分支,准备在合适的时候把那些改动合并进来,但现在它就是不行。
如果你使用的是Python 2.x,并且启用了请求上下文预处理器,我不太明白你为什么会出现那个错误。如果你能确认这两点是正确的,我明天很乐意再仔细看看。
编辑:
这可能是个问题,也可能不是,但我注意到你在循环遍历你的Location对象时,使用了相同的变量名:
{% for location in location %}
<h2>{{ location.name }}</h2>
{% endfor %}
{% bootstrap_paginate location %}
有可能Django的模板作用域导致你传给bootstra_paginate的对象是“location”的最后一个实例,而不是整个集合吗?这是我随便猜的第一步,因为其他地方看起来都是对的。