【问题标题】:Django: Filter paginated list with another URL parameterDjango:使用另一个 URL 参数过滤分页列表
【发布时间】:2018-01-02 10:12:23
【问题描述】:

我有我用Paginator 显示的游戏列表。我还希望能够按类型过滤游戏。

在我看来,我有简单的代码来检查,如果流派参数(“zanr”)是 URL 的一部分:

genre = request.GET.get('zanr')

if genre:
    free_games_list = free_games_list.filter(category__id=genre)

在我的查看页面上,我有 HTML Select,其中流派名称及其 ID 作为值。

在 Select 中的项目被选中后,我没有那么漂亮的 JS 代码重定向到新页面:

 $('#select').change(function () {

        var selectElement = $(this);

        var url = window.location.href;

        if (url.indexOf('?') > -1) {
            url += '&zanr=' + selectElement.val();
        } else {
            url += '?zanr=' + selectElement.val();
        }

        window.location.href = url;
    });

这适用于第一个流派选择。但是当我选择另一种类型时,URL 中的参数现在只是像这样重复:zanr=5&zanr=4&zanr=3

我想过做更多的 JS 来删除参数,但我想会有更好和更简单的选择如何做到这一点。

我也尝试将其作为Select 内的Form 进行,但在传递所选值时遇到问题..

【问题讨论】:

    标签: javascript python django pagination


    【解决方案1】:

    尝试在您的 django 视图中而不是 javascript 中处理查询字符串的创建。

    def myView(request):
        query_string = ''
        genre = request.GET.get('zanr') 
        if genre:
            query_string += '&zanr={0}'.format(genre)
            free_games_list = free_games_list.filter(category__id=genre)
    
        # Pass query_string to template
    

    然后在您的模板中将此值附加到您的分页器按钮。

    <form action="{% url 'game_list' %}" method="GET">
      <label>Zanr</label>
      <select name="zanr">
        <option value="3">3</option>
        <option value="4">4</option>
      </select>
    </form>
    
    # ...        
    
    <ul class="pagination">
      {% if objects.has_previous %}
    <li>
      <a href="?page={{ objects.previous_page_number }}{{ query_string }}">&laquo;</a>
    </li>
    {% else %}
      <li class="disabled"><span>&laquo;</span></li>
    {% endif %}
    
    # ...
    
    <script>
    $('#select').change(function () {
      var form= $(this).parent();
      form.submit();
    });
    </script>
    

    【讨论】:

    • 效果很好,谢谢。确实比我的 JavaScript“解决方案”要好得多。
    【解决方案2】:

    我建议不要使用 URL,而是使用 form,并且在表单中您应该包含隐藏的分页参数以保留分页标准:

    <form action="{% url 'my_search_url' %}" method="GET">
        <label for="zanr">Zanr</label>
        <select name="zanr" onchange="this.form.submit()">
            <option value="1" {% if genre == '1' %}selected{% endif %}>A</option>
            <option value="2" {% if genre == '2' %}selected{% endif %}>B</option>
        </select>
        <!-- Add hidden pagination params here -->
    </form>
    

    在上下文中从视图中发回genre,以在下拉列表中显示选定的基因。

    【讨论】:

      猜你喜欢
      • 2014-08-18
      • 2017-11-16
      • 2014-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 2017-02-27
      • 1970-01-01
      相关资源
      最近更新 更多