python - 使用 ListView django 进行分页
问题描述
我想创建带有搜索和分页的应用程序。分页不适用于 ListView。
当我单击“下一步”链接时,我将从起始页面http://127.0.0.1:8001/ ---> 移动到 http://127.0.0.1:8001/?city=2但列表的元素没有改变。
然后单击“下一步”链接并没有更改网址(http://127.0.0.1:8001/?city=2 --> http://127.0.0.1:8001/?city=2)。
你能帮我找出错误吗? 我认为 *.html 文件中的错误,但找不到
我的代码: models.py
from django.db import models
class City(models.Model):
name = models.CharField(max_length=255)
state = models.CharField(max_length=255)
class Meta:
verbose_name_plural = "cities"
def __str__(self):
return self.name
网址.py
# cities/urls.py
from django.urls import path
from . import views
from .views import HomePageView, SearchResultsView
urlpatterns = [
path('search/', SearchResultsView.as_view(), name='search_results'),
path('', HomePageView.as_view(), name='home'),
path('city/<int:pk>/', views.city_detail, name='city_detail'),
]
视图.py
from django.shortcuts import render
from django.views.generic import TemplateView, ListView
from .models import City
from django.db.models import Q
from django.shortcuts import render, get_object_or_404
class HomePageView(ListView):
model = City
template_name = 'cities/home.html'
paginate_by = 3
def city_detail(request, pk):
city = get_object_or_404(City, pk=pk)
return render(request, 'cities/city_detail.html', {'city': city})
class SearchResultsView(ListView):
model = City
template_name = 'cities/search_results.html'
def get_queryset(self): # new
query = self.request.GET.get('q')
object_list = City.objects.filter(
Q(name__icontains=query) | Q(state__icontains=query)
)
return object_list
主页.html
<!-- templates/home.html -->
<h1>HomePage</h1>
<form action="{% url 'search_results' %}" method="get">
<input name="q" type="text" placeholder="Search...">
</form>
<ul>
{% for city in object_list %}
<li>
<h1><a href="{% url 'city_detail' pk=city.pk %}">{{ city.name }}</a></h1>
</li>
{% endfor %}
</ul>
{{page_obj}}
<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="/?city={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="page-current">
Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.
</span>
{% if page_obj.has_next %}
<a href="/?city={{ page_obj.next_page_number }}">next</a>
{% endif %}
</span>
</div>
解决方案
页面查询参数的标准名称是'page'
您应该更改查询参数的名称,或者使用该?page=
参数呈现模板。
选项 1:更改page_kwarg
您可以通过更改page_kwarg
属性 [Django-doc]来更改它:
class HomePageView(ListView):
model = City
template_name = 'cities/home.html'
paginate_by = 3
page_kwarg = 'city'
选项 2:更改模板
然而,简单地更改模板可能更有意义,以便它page
用作参数:
<div class="pagination">
<span class="page-links">
{% if page_obj.has_previous %}
<a href="/?page={{ page_obj.previous_page_number }}">previous</a>
{% endif %}
<span class="page-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>
{% endif %}
</span>
</div>
推荐阅读
- django - 有什么方法可以将多个 API 结果聚合到 Django Rest Framework 中的单个 API 中?
- android - 改造中以下 Api 调用的格式是什么?
- arrays - jq:无法使用字符串“id”索引数组
- php - 未捕获的错误:找不到类 'WindowsAzure\Common\ServicesBuilder' - MS Azure | PHP
- java - 工厂、开关和随机 - java
- python - 为什么这个布尔表达式不允许作为 Python 中 while 循环的条件?
- reactjs - 何时使用 inputRef.current 而不是 this.inputRef React.js?
- twitter-bootstrap - 如何使用 npm 2 不同的引导程序版本进行安装?
- python - Telegram bot 如何通过 nltk python 回答问题
- sql - ISNULL 或 COALESCE 不适用于加入和枢轴操作