Django:使用其他网址参数

时间:2017-07-26 21:43:19

标签: javascript python django pagination

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

在我看来,我有简单的代码可以检查,如果genre参数(" zanr")是URL的一部分:

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

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

在我的视图页面上,我有HTML Select,其中包含流派名称及其ID作为值。

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

 $('#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进行此操作,但在传递所选值时出现问题。

2 个答案:

答案 0 :(得分:1)

我建议使用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以在下拉列表中显示所选的生成器。

答案 1 :(得分: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>