【问题标题】:Django: Combining search view with PaginationDjango:将搜索视图与分页相结合
【发布时间】:2019-02-21 13:20:08
【问题描述】:

在 Django CBV (ListView) 中,使用 GET 方法提交表单后,使用 filter_1filter_2 字段,我得到的结果 URL 类似于:

http://example.com/order/advanced-search?filter_1=foo&filter_2=bar

一切正常。 但是,我想使用分页,向我的模板证明一个 URL,例如:

http://example.com/order/advanced-search?page=2&filter_1=foo&filter_2=bar

假设我可以为此目的重写此方法:

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['my_form_values'] = self.request.GET

现在,如何在我的分页模板中使用my_form_values 来显示正确的网址?

现在,这是我的(简化的)分页模板代码:

{% for num in page_obj.page_range %}
    {% if page_obj.number == num %}
        <li class="page-item active">
            <span class="page-link">{{ num }}</span>
        </li>
    {% else %}
        <li class="page-item">
            <a class="page-link" href="?page={{ num }}">{{ num }}</a>
        </li>
    {% endif %}
{% endfor %}

【问题讨论】:

  • ?page={{num}} 的问题在于您丢失了其余的过滤器(例如filter_1=foo)。 Here's a template tag 这可能有用。我是通过搜索django querydict template tag找到的,我相信我过去也见过其他人。
  • @Alasdair href="?page={{ num }}&amp;{% qs_alter request.GET -page %}" 几乎可以工作了。唯一的问题是page 参数没有被移除并且被堆叠。最后,我得到了类似的东西:?page=3&amp;page=4&amp;filter_1=foo&amp;filter_2=bar
  • _, k = arg.split("-", 2) 替换k, v = arg.split("-", 2)(没有意义,因为键是空的)是可行的……我不确定我实际上理解了如何使用这个模板标签。
  • 来自examples,我想你想要?{% qs_alter request.GET page=num %},但是如果这不起作用,我恐怕无法帮助你调试它,因为我没有使用过那个标签前。您可能会发现搜索类似标签更容易 - 我只是将它作为我以前见过的事物类型的一个示例。
  • 感谢它与{% qs_alter request.GET page=num %} 一起按预期工作。请考虑写一个答案,以便我接受:)

标签: python django django-class-based-views django-pagination


【解决方案1】:

我是这样做的

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

然后是模板中的分页

<ul class="pagination">
    {% if page_obj.has_previous %}
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=1 %}">{% trans 'first' %}</a>
        </li>
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=page_obj.previous_page_number %}">{{ page_obj.previous_page_number }}</a>
        </li>
    {% endif %}
    <li class="page-item active"><a class="page-link"
                                    href="?{{ page_obj.number }}">{{ page_obj.number }}</a>
    </li>
    {% if page_obj.has_next %}
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=page_obj.next_page_number %}">{{ page_obj.next_page_number }}</a>
        </li>
        <li class="page-item"><a class="page-link"
                                 href="?{% param_replace page=page_obj.paginator.num_pages %}">{% trans 'last' %}</a>
        </li>
    {% endif %}
</ul>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多