在django_tables2中搜索特定数据后如何解决分页问题

时间:2019-04-25 07:36:38

标签: django pagination django-tables2

在我的项目中,我使用成功的django_tables2来实现服务器端处理。

我唯一不知道如何处理的事情是,在搜索后(例如,在为我的应用程序呈现客户端的模板中按名称进行搜索),尽管搜索会根据名称给出一些返回结果,但事实并非如此如果结果记录根据我的分页分布在一页以上,则工作正常。

换句话说,当我单击 2 (返回结果的第二页)时,该应用程序将显示与客户有关的所有页面 1 2 3 ... 45 next (因为我想访问/ clients /网址,而不是仅用于自定义搜索数据的 1 2 next 结构。

当我单击下一个和上一个按钮时,也会发生这种情况。

一个简单的解决方案可能是增加分页限制,以便将所有可能的结果显示在一页上,但是此解决方案不适用于大结果集。

有什么解决方案可以避免加载并显示搜索栏中的所有页面,而仅保留自定义搜索的结果吗?

下面是我的摘录。

url.py

url(r'^clients/$', views.client_list, name='client_list'),


models.py

class Client(models.Model):
    name = models.CharField(max_length=50, verbose_name="Name")
    surname = models.CharField(max_length=50, verbose_name="Surname")
activity = models.IntegerField(choices=ACTIVITY_OPTIONS, null=True,default=ACTIVE)


views.py

def client_list(request, template_name='clients/client_list.html'):
    if request.method == 'POST':
        search_string = request.POST['search_client']
        current_client=Client.objects.filter(Q(activity=1) &  Q(name=search_string)| Q(surname=search_string))
        single_table=ClientTable(current_client)
        RequestConfig(request).configure(single_table)
        return render(request,template_name, {'single_table': single_table})
    else:
        clients=Client.objects.filter(activity=1)
        table = ClientTable(clients)
        RequestConfig(request).configure(table)
        return render(request,template_name, {'table': table})

tables.py

class ClientTable(tables.Table):

class Meta:
        #define the model
        model = Client
        exclude=('..')
        template_name = 'django_tables2/bootstrap.html'
        sequence = ("surname", "name",)


template

{% extends 'base.html' %}
{% load has_group %}
{% load render_table from django_tables2 %}
{% load bootstrap3 %}
{% load static %}
{% load staticfiles %}

{% block content %}
      <div class="container">
        <div class="row">
          <div class="col-md-12">

<form class="well" method="post" action="">
      {% csrf_token %}
Client Search:<br>
  <input type="text" class="form-control" id="search" name="search_client">
  <br>
        {% buttons %}
          <button type="submit" class="btn btn-primary">
              {% bootstrap_icon "like" %} Submit
          </button>
      {% endbuttons %}
  </form>


{% if single_table %}
    {% render_table single_table %}
{% endif %}

{% if table %}
    {% render_table table %}
{% endif %}


</div>
</div>
</div>
{% endblock %} 

1 个答案:

答案 0 :(得分:0)

最后,我找到了解决方法。

Django过滤器https://django-filter.readthedocs.io/en/master/index.html可以在这种情况下使用。

我遵循的步骤是:

1)将'django_filters'导入到settings.py

2)定义过滤器。py

import django_filters
from .models import Patient


    class ClientFilter(django_filters.FilterSet):
        name = django_filters.CharFilter(lookup_expr='icontains')


        class Meta:
            model = Client
            fields = ['id','name','surname']

3)修改views.py

class FilteredClientListView(SingleTableMixin, FilterView):
    table_class = ClientTable
    model = Client
    template_name ='clients/client_list2.html'

    filterset_class = ClientFilter

4)由于我使用了基于类的函数,因此请相应地修改urls.py

url(r'^clients2/$', views.FilteredClientListView.as_view(), name='client_list2'),

5)修改我的模板

{% extends 'base.html' %}
{% load has_group %}
{% load render_table from django_tables2 %}
{% load bootstrap3 %}
{% load static %}
{% load staticfiles %}

{% block content %}
      <div class="container">
        <div class="row">
          <div class="col-md-12">

<form class="well" method="post" action="">
      {% csrf_token %}
Client Search:<br>
  <input type="text" class="form-control" id="search" name="search_client">
  <br>
        {% buttons %}
          <button type="submit" class="btn btn-primary">
              {% bootstrap_icon "like" %} Submit
          </button>
      {% endbuttons %}
  </form>

{% if filter %}
    <form action="" method="get" class="form form-inline">
        {% bootstrap_form filter.form layout='inline' %}
        {% bootstrap_button 'filter' %}
    </form>
{% endif %}

{% if single_table %}
    {% render_table single_table %}
{% endif %}

{% if table %}
    {% render_table table %}
{% endif %}


</div>
</div>
</div>
{% endblock %} 

P.S:在views.py中导入适当的表格和过滤器