问题描述
我有一个Django页面,该页面具有一个表来显示我的模型中的数据。该表具有分页以及多个过滤器。我已经设法使分页和过滤器一起工作到一定程度,但是URL都弄糟了。好像是将新的查询字符串附加到URL的末尾。
我对此有两个主要问题:
问题1的屏幕截图:
问题2的屏幕截图:
filters.py:
class SetFilter(django_filters.FilterSet):
name = CharFilter(field_name='name',lookup_expr='icontains',label='',)
type = AllValuesFilter(field_name='type',choices=Set.objects.values_list('type',flat=True).distinct().order_by('type'),empty_label="")
nonfoil = AllValuesFilter(field_name='is_non_foil_only',choices=Set.objects.values_list('is_non_foil_only',flat=True).distinct().order_by('is_non_foil_only'),empty_label="")
foil = AllValuesFilter(field_name='is_foil_only',choices=Set.objects.values_list('is_foil_only',flat=True).distinct().order_by('is_foil_only'),empty_label="")
digital = AllValuesFilter(field_name='is_online_only',choices=Set.objects.values_list('is_online_only',flat=True).distinct().order_by('is_online_only'),empty_label="")
foreign = AllValuesFilter(field_name='is_foreign_only',choices=Set.objects.values_list('is_foreign_only',flat=True).distinct().order_by('is_foreign_only'),empty_label="")
class Meta:
model = Set
fields = ''
views.py
def sets_page(request):
set_list = Set.objects.order_by('-id')
last_modified = set_list[0].last_modified
set_filter = SetFilter(request.GET,queryset=set_list)
set_list = set_filter.qs
paginator = Paginator(set_list,22)
is_paginated = True if paginator.num_pages > 1 else False
page = request.GET.get('page') or 1
try:
current_page = paginator.page(page)
except InvalidPage as e:
raise Http404(str(e))
context = {
'last_modified': last_modified,'is_paginated': is_paginated,'current_page': current_page,'set_filter': set_filter
}
return render(request,"main/sets.html",context)
pagination.html
{% if current_page.has_next %}
{% if 'name' in request.get_full_path %}
<a class="page-link prevIoUs-next" href="{{ request.get_full_path }}&page={{ current_page.next_page_number }}">»</a>
{% else %}
<a class="page-link prevIoUs-next" href="?page={{ current_page.next_page_number }}">»</a>
{% endif %}
{% else %}
<a class="page-link prevIoUs-next" href="">»</a>
{% endif %}
解决方法
我一直在使用我之前在这里找到的templatetag解决方案,可以引用它,但是我只发布片段:
-
如果不知道如何创建模板标签。 Read here。这很容易,而且任务不那么长。
-
在过滤器/标签文件中添加以下代码:
@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()
将自定义过滤器加载到模板{% load "file_name_here" ... %}
然后在您的分页链接上:
<a class="page-link" href="?{% param_replace page=current_page.next_page_number %}"> Next </a>