Как исправить нумерацию страниц после поиска определенных данных в django_tables2 - PullRequest
0 голосов
/ 25 апреля 2019

В моем проекте я успешно использую django_tables2 для обеспечения обработки на стороне сервера.

Единственное, что я не знаю, как с этим справиться, это то, что после поиска, например, по имени в шаблоне, отображающем клиентов для моего приложения, поиск, несмотря на то, что он возвращает некоторые возвращаемые результаты, основанные на имени, не работает нормально , если записи результатов распространяются на более чем одной странице на основе моей нумерации страниц.

Другими словами, когда я нажимаю 2 (вторая страница моих возвращенных результатов), приложение отображает все страницы, относящиеся к клиентам 1 2 3 ... 45 далее (как я хочу, чтобы получить / клиентов / URL, а не 1 2 следующая структура только для пользовательских данных поиска.

Это происходит также при нажатии следующих и предыдущих кнопок.

Одно простое решение. Может быть, увеличить мой предел нумерации страниц, чтобы показать все возможные результаты на одной странице, но это решение не подходит для больших наборов результатов.

Существует ли какое-либо решение, позволяющее избежать загрузки и отображения всех страниц в строке поиска и сохранять только результаты моего пользовательского поиска?

Ниже мои фрагменты.

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 голосов
/ 25 апреля 2019

Наконец, после поиска я нашел решение.

Фильтры Django https://django -filter.readthedocs.io / en / master / index.html можно использовать в ситуациях, подобных этой.

Шаги, которые я выполнил:

1) импортировать 'django_filters' в settings.py

2) Определить filters.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 %} 

PS: импорт в views.py соответствующих таблиц и фильтров

...