【问题标题】:Implementing Pagination with Django-Filter使用 Django-Filter 实现分页
【发布时间】:2021-12-29 00:34:53
【问题描述】:

我希望使用 Django-Filter 的基于函数的视图来实现分页。我目前可以使用搜索功能,但无法在线找到有关如何使用 Django-filter 实现分页的文档;无法使用我在网上找到的参考资料。

到目前为止我所拥有的:

views.py

from django.shortcuts import render
from .models import Stock
from .filters import StockFilter

def home(request):
  return render(request, 'stockwatcher/home.html', {'title': 'Home'})

def stock_search(request):
  f = StockFilter(request.GET, queryset=Stock.objects.all())
  return render(request, 'stockwatcher/search_results.html', {'filter': f})

filters.py

import django_filters
from .models import *

class StockFilter(django_filters.FilterSet):
  senator = django_filters.CharFilter(field_name='senator' ,lookup_expr='icontains')
  ticker = django_filters.CharFilter(field_name='ticker', lookup_expr='iexact')
  
  class Meta:
    model = Stock
    fields = [
      'senator',
      'ticker'
    ]
    exclude = [
      'asset_description',
      'asset_type',
      'amount',
      'type',
      'transaction_date',
    ]

urls.py

from django.urls import path, re_path
from . import views

urlpatterns = [ path('', views.home, name="stockwatcher-home"),
                path('stocks/', views.stock_search, name="stockwatcher-stocks"),
                path('about/', views.about, name="stockwatcher-about")]


search_results.html

{% extends "stockwatcher/base.html" %}
{% block content %}
{% load widget_tweaks %}


<div class="container">
  <div class="row" style="padding: 50px;">
    <form method="get">
      {{ filter.form.as_p }}
      <input type="submit" />
    </form>
  </div>

    <div class="row">
    {% for stock in filter.qs %}
    <div class="col-4">
      <div class="card text-white bg-info mb-3" style="max-width: 18rem;">
        <div class="card-header">{{stock.transaction_date}}</div>
        <div class="card-body">
          <h5 class="card-title" style="color: white"> {{stock.ticker}} </h5>
          <p class="card-text">{{stock.senator}} - {{stock.type}}</p>
        </div>
      </div>
    </div>
    {% endfor %}
</div>

<!--{% if is_paginated %}-->
<!--  {% if page_obj.has_previous %}-->
<!--    <a class="btn btn-outline-info mb-4" href="?page=1">First</a>-->
<!--    <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.previous_page_number }}">Previous</a>-->
<!--  {% endif %}-->

<!--  {% if page_obj.has_next %}-->
<!--    <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.next_page_number }}">Next</a>-->
<!--    <a class="btn btn-outline-info mb-4" href="?page={{ page_obj.paginator.num_pages }}">Last</a>-->
<!--  {% endif %}-->
<!--{% endif %}-->

{% endblock content %}

【问题讨论】:

    标签: python python-3.x django pagination django-filter


    【解决方案1】:

    试试这个 视图.py

    from django.shortcuts import render
    from .models import Stock
    from .filters import StockFilter
    from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
    
    def home(request):
        return render(request, 'stockwatcher/home.html', {'title': 'Home'})
    
    def stock_search(request):
        f = StockFilter(request.GET, queryset=Stock.objects.all())
        paginator = Paginator(f.qs, your_page_size)
    
        page = request.GET.get('page')
        try:
            response = paginator.page(page)
        except PageNotAnInteger:
            response = paginator.page(1)
        except EmptyPage:
            response = paginator.page(paginator.num_pages)
      return render(request, 'stockwatcher/search_results.html', {'filter': response,'filter_form':f})
    

    您的模板

    {% extends "stockwatcher/base.html" %}
    {% block content %}
    {% load widget_tweaks %}
    
    
    <div class="container">
      <div class="row" style="padding: 50px;">
        <form method="get">
          {{ filter_form.form.as_p }}
          <input type="submit" />
        </form>
      </div>
    
        <div class="row">
        {% for stock in filter %}
        <div class="col-4">
          <div class="card text-white bg-info mb-3" style="max-width: 18rem;">
            <div class="card-header">{{stock.transaction_date}}</div>
            <div class="card-body">
              <h5 class="card-title" style="color: white"> {{stock.ticker}} </h5>
              <p class="card-text">{{stock.senator}} - {{stock.type}}</p>
            </div>
          </div>
        </div>
        {% endfor %}
    </div>
    
    <div >
     <span class="step-links">
     {% if filter.has_previous %}
     <a href="?page={{ filter.previous_page_number }}"><span style="font-size:30px;float:left;" class="glyphicon glyphicon-arrow-left"> left</span></a>
     {% endif %}
     {% if filter.has_next %}
     <a href="?page={{ filter.next_page_number }}"> <span style="font-size:30px;float:right;" class="glyphicon glyphicon-arrow-right">right </span></a>
     {% endif %}
     </span>
    </div>
    {% endblock content %}
    

    不要忘记在your_page_size中输入一个数字

    【讨论】:

    • 这似乎使搜索过滤工作的分页。我注意到的一件事是搜索框没有出现。 (我通过在 URL 末尾添加搜索参数来测试搜索)。 {{ filter.form.as_p }} 据我所知,这个 sn-p 应该会根据 StockFilter 的字段自动创建输入框。我目前只看到奇怪的提交按钮......也许我错过了一些东西。
    • @SL。它对你有用吗?
    • 抱歉,刚刚编辑了评论。这就是我看到的imgur.com/a/DULFhBR。由于某种原因,它看起来不像正确渲染{{ filter.form.as_p }}
    • @SL。我刚刚更新了我的视图,模板试试看。
    • 啊,是的——行得通!谢谢。您是否为此引用了任何文档?觉得我需要再读一遍! :) 更新:没关系——我明白你做了什么,这是有道理的。谢谢!
    【解决方案2】:

    看看这个,希望你能从这里得到答案

    django-filter use paginations

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2017-10-18
    • 1970-01-01
    • 2019-06-26
    • 2020-03-05
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2020-07-17
    相关资源
    最近更新 更多