【发布时间】:2021-03-29 23:04:13
【问题描述】:
我在过滤后尝试使用分页时遇到问题。 我在表格中制作了一个搜索表格。在第一页中,搜索应用程序后显示所有带有条件的合同,但是当我单击第 2 页时,它会刷新并显示其他结果。如果我在搜索表单中重写,它将在第 2 页显示其他结果 在我的 form.py 中
class ContractSearchForm(forms.ModelForm):
use_required_attribute = False
export_to_CSV = forms.BooleanField(required=False)
class Meta:
model = Contracts
fields = ["contract","name"]
在我看来.py
def list_contract(request):
header= "LIST OF CONTRACT"
form = ContractSearchForm(request.POST or None)
queryset =Contracts.objects.all()
#pagination
paginate_by = 10
paginate_by = request.GET.get('paginate_by', paginate_by) or 10
user_list = queryset
paginator = Paginator(user_list, paginate_by)
page = request.GET.get('page',1)
try:
queryset = paginator.page(page)
except PageNotAnInteger:
users = paginator.page(1)
except EmptyPage:
users = paginator.page(paginator.num_pages)
context = {
"form":form,
"header": header,
"queryset": queryset1,
'paginate_by':paginate_by,
}
if request.method == 'POST':
#Tạo queryset sang filter
queryset2 = Contracts.objects.filter(contract__icontains=form['contract'].value(),
name__icontains=form['name'].value().upper()
)
#pagination when search
paginate_by = 10
paginate_by = request.GET.get('paginate_by', paginate_by) or 10
user_list = queryset
paginator = Paginator(user_list, paginate_by)
page = request.GET.get('page',1)
try:
queryset = paginator.page(page)
except PageNotAnInteger:
users = paginator.page(1)
except EmptyPage:
users = paginator.page(paginator.num_pages)
context = {
"form":form,
"header": header,
"queryset": queryset,
'paginate_by':paginate_by,
}
return render (request, "customer1.html",context)
在 customer1.html 中
{% if queryset.has_previous %}
<a href="?{% param_replace page=1 %}">First</a>
{% if queryset.previous_page_number != 1 %}
<a href="?{% param_replace page=queryset.previous_page_number %}">Previous</a>
{% endif %}
{% endif %}
Page {{ queryset.number }} of {{ queryset.paginator.num_pages }}
{% if queryset.has_next %}
{% if queryset.next_page_number != queryset.paginator.num_pages %}
<a href="?{% param_replace page=queryset.next_page_number %}">Next</a>
{% endif %}
<a href="?{% param_replace page=paginator.num_pages %}">Last</a>
{% endif %}
我的 ulr.py
urlpatterns = [
path('admin/', admin.site.urls),
path('demo',views.showDemoPage),
path('', include('test_upload_filter.urls')),
path('add_items/', views.add_items, name='add_items'),
path('contract_detail/<str:contract_id>/', views.contract_detail, name="contract_detail"),
在我的应用 url.py 中
app_name='example_app'
urlpatterns = [
path("customer1/",page,name="list_contract")
]
我更新了我的代码,我使用了模板标签 my_tags.py
@register.simple_tag(takes_context=True)
def param_replace(context, **kwargs):
d = context['request'].GET.copy()
for k, v in kwargs.items():
d[k] = v
for k in [k for k, v in d.items() if not v]:
del d[k]
return d.urlencode()
我尝试将 django-filter 与分页一起使用,但 django-filter 无法区分大小写。
我的 url 浏览器在搜索 127.0.0.1:8000/customer1 之后和之前仍然相同,在第 2 页 http://127.0.0.1:8000/customer1/?page=2
感谢您的阅读。抱歉,我的代码太长了,因为我必须重写两次分页功能。
【问题讨论】:
标签: django search filter pagination