使用 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>



杨魅力
浏览 166回答 1
1回答

牧羊人nacy

页面查询参数的标准名称是'page'您应该更改查询参数的名称,或者使用该?page=参数呈现模板。选项 1:更改page_kwarg您可以通过更改page_kwarg属性 [Django-doc]来更改它:class HomePageView(ListView):&nbsp; &nbsp; model = City&nbsp; &nbsp; template_name = 'cities/home.html'&nbsp; &nbsp; paginate_by = 3&nbsp; &nbsp; page_kwarg = 'city'选项 2:更改模板然而,简单地更改模板可能更有意义,以便它page用作参数:<div class="pagination">&nbsp; &nbsp; <span class="page-links">&nbsp; &nbsp; &nbsp; &nbsp; {% if page_obj.has_previous %}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="/?page={{ page_obj.previous_page_number }}">previous</a>&nbsp; &nbsp; &nbsp; &nbsp; {% endif %}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="page-current">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Page {{ page_obj.number }} of {{ page_obj.paginator.num_pages }}.&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </span>&nbsp; &nbsp; &nbsp; &nbsp; {% if page_obj.has_next %}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <a href="/?page={{ page_obj.next_page_number }}">next</a>&nbsp; &nbsp; &nbsp; &nbsp; {% endif %}&nbsp; &nbsp; </span></div>
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python