在我的项目中,我使用成功的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 %}
答案 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中导入适当的表格和过滤器