brs*_*gic 2 sorting django pagination
我尝试用Django中的分页选项实现分页选项但是,我无法弄清楚我该如何正确地做到这一点.
views.py
def search(request):
eList = Employer.objects.filter(eminence__lt=4).order_by('-eminence')
paginator = Paginator(eList, 3) # Show 3 contacts per page
page = request.GET.get('page')
try:
employerList = paginator.page(page)
except PageNotAnInteger:
employerList = paginator.page(1)
except EmptyPage:
employerList = paginator.page(paginator.num_pages)
return render_response(request, 'employer/search.html', {'employerList':employerList})
Run Code Online (Sandbox Code Playgroud)
search.html
<div class="pagination">
<span class="step-links">
{% if employerList.has_previous %}
<a href="?page={{ employerList.previous_page_number }}">previous</a>
{% endif %}
<span class="current"> Page {{ employerList.number }} of {{ employerList.paginator.num_pages }}.</span>
{% if employerList.has_next %}
<a href="?page={{ employerList.next_page_number }}">next</a>
{% endif %}
</span>
</div>
Run Code Online (Sandbox Code Playgroud)
这个例子很有用,但是你可以看到,我需要获得所有Employer对象的每个导航.之后Paginator根据页码处理查询中的对象.但是,我认为分页应该在查询期间完成,并且只根据页码获取我想要的X对象.当然,我可以用这种方式修改代码,但我无法弄清楚为什么人们会使用Paginator虽然有这样的开销.我可能会忽略一个细节......
我的第二个问题是我如何应用排序列表?我应该修改我的url并传递一个排序方法和页码,并根据它们通过sort方法得到问题并将其交给Paginator?
这对我来说似乎合情合理,但我只是想知道在django有没有更好的方法.
谢谢
Django对于延迟加载数据非常聪明,这使得这些查询非常有效.让我们来看看你的请求会发生什么......
eList = Employer.objects.filter(eminence__lt=4).order_by('-eminence')
## No database query.
paginator = Paginator(eList, 3)
## No database query.
employerList = paginator.page(2)
## SELECT COUNT(*) FROM `yourproject_employer`
## WHERE `yourproject_employer`.`eminence` < 4
# Force iteration. Same as looping over results:
foo = list(employerList.object_list)
## SELECT * FROM `yourproject_employer`
## WHERE `yourproject_employer`.`eminence` < 4
## ORDER BY `yourproject_employer`.`eminence` DESC
## LIMIT 3 OFFSET 3
Run Code Online (Sandbox Code Playgroud)
至于你的排序问题,我会说你只是修改GET你建议的参数.只是要非常小心地将其传递给数据库.例如,我会列出可能的排序并对其进行验证.这也意味着您不必公开数据库的内部工作.
VALID_SORTS = {
"pk": "pk",
"pkd": "-pk",
"em": "eminence",
"emd": "-eminence",
}
DEFAULT_SORT = 'pk'
def search(request):
sort_key = request.GET.get('sort', DEFAULT_SORT) # Replace pk with your default.
sort = VALID_SORTS.get(sort_key, DEFAULT_SORT)
eList = Employer.objects.filter(eminence__lt=4).order_by(sort)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4933 次 |
| 最近记录: |