在ListView django中分页



我正在尝试用html模板对表中的数据进行分页,但它不起作用。我使用列表视图中的默认分页系统。此外,我还有一个表单,用户可以在其中按页面值传递项目。这是我的views.py:代码

class CategoryListView(ListView):
model = Category
def get_paginate_by(self, queryset, **kwargs):
itemsForm = ItemsPerPageForm(self.request.GET)
if itemsForm.is_valid():
itemsPerPage = itemsForm.cleaned_data.get('items_per_page')
print(itemsPerPage)
if itemsPerPage is None:
return 4
else:
if itemsPerPage > 0 and itemsPerPage <= Category.objects.get_queryset().count():
return itemsPerPage
else:
return 4
def get_context_data(self, *, object_list=Expense.objects.get_queryset(), **kwargs):
categoriesList = Category.objects.get_queryset()
queryset = object_list
return super().get_context_data(
noOfExpenses=zip(categoriesList, noOfExpenses(queryset)),
itemsForm = ItemsPerPageForm
)

这是我的django模板:

</table>
<tbody>
{% for category, expenses in noOfExpenses %}
<tr>
<td>{{ page_obj.start_index|add:forloop.counter0}}.</td>
<td>{{ category.name|default:"-" }}</td>
<td>{{ expenses }}</td>
</tr>
{% empty %}
<tr>
<td colspan="6">no items</td>
</tr>
{% endfor %}
</tbody>
</table>
<hr/>
{% include "_pagination.html" %}
{{page_obj}}
<form method="get" action="">
{{itemsForm.as_p}}
<button type="submit">submit</button>
</form>

和_pagination.html:

<div class="pagination">
<span class="pagination__nav">
{% if page_obj.has_previous %}
<a href="?page=1">&laquo; first</a>
<a href="?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="?page={{ page_obj.next_page_number }}">next</a>
<a href="?page={{ page_obj.paginator.num_pages }}">last &raquo;</a>
{% endif %}
<br/> Total items: {{page_obj.paginator.count}}
</span>
</div>

所以最后,在网站上,尽管我只有4个项目,但我有2个页面,其中的项目从1-7开始编号,并重复。当我传递值1时,我有4页,但项目的数量没有改变(表中仍然有4页(。

class MyView(ListView):
template_name = "page.html"
paginate_by = 4
def get_paginate_by(self, queryset):
itemsForm = ItemsPerPageForm(self.request.GET)
if itemsForm.is_valid():
itemsPerPage = itemsForm.cleaned_data.get('items_per_page')
itemsPerPage = int(itemsPerPage)
print(itemsPerPage)
if  itemsPerPage > 0 and itemsPerPage <= Category.objects.get_queryset().count():
self.request.session['paginate_by'] = itemsPerPage
else:
self.request.session['paginate_by'] = self.paginate_by
return self.request.GET.get('paginate_by', self.paginate_by)

在模板中:只显示paginate_by会话

好的,所以我找到了答案。Django中的泛型视图使用object_list作为查询集。然后使用它来呈现查询集中的数据。我需要将noOfExpenses更改为object_list并将其转换为list,仅此而已。

您可以使用获得paginate_by

page_obj.paginator.per_page

最新更新