Django分页和过滤器附加到url而不是替换

问题描述

我有一个Django页面,该页面具有一个表来显示我的模型中的数据。该表具有分页以及多个过滤器。我已经设法使分页和过滤器一起工作到一定程度,但是URL都弄糟了。好像是将新的查询字符串附加到URL的末尾。

我对此有两个主要问题:

  1. 如果我使用单个过滤器,它将在所有过滤器的URL中添加所有空查询字符串。
  2. 如果我已过滤表中的数据并尝试更改页面,它将在页面末尾附加页面查询字符串而不是替换它。

问题1的屏幕截图:

enter image description here

问题2的屏幕截图:

enter image description here

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 }}">&#187;</a>
    {% else %}
       <a class="page-link prevIoUs-next" href="?page={{ current_page.next_page_number }}">&#187;</a>
    {% endif %}
{% else %}
    <a class="page-link prevIoUs-next" href="">&#187;</a>
{% endif %}

解决方法

我一直在使用我之前在这里找到的templatetag解决方案,可以引用它,但是我只发布片段:

  1. 如果不知道如何创建模板标签。 Read here。这很容易,而且任务不那么长。

  2. 在过滤器/标签文件中添加以下代码:

@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>

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...