我有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
进行此操作,但在传递所选值时出现问题。
答案 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 }}">«</a>
</li>
{% else %}
<li class="disabled"><span>«</span></li>
{% endif %}
# ...
<script>
$('#select').change(function () {
var form= $(this).parent();
form.submit();
});
</script>