【问题标题】:How to fix pagination after making a search for specific data in django_tables2在 django_tables2 中搜索特定数据后如何修复分页
【发布时间】:2019-04-25 07:36:38
【问题描述】:

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

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

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

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

一个简单的解决方案可能是增加我的分页限制,以便在一页中显示所有可能的结果,但这种解决方案不适合大型结果集。

是否有任何解决方案可以避免在搜索栏中加载和显示所有页面而只保留我的自定义搜索结果?

下面是我的sn-ps。

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 %} 

【问题讨论】:

    标签: django pagination django-tables2


    【解决方案1】:

    终于找到了解决办法。

    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 : 在 vi​​ews.py 中导入适当的表和过滤器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 2013-04-28
      • 2021-01-10
      • 2012-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多