【发布时间】:2019-11-13 03:57:57
【问题描述】:
在 Django 中,我有一个表单允许用户过滤数据库中的对象,当用户为参数选择一个值但我想允许多个选择时,这很有效。
我试过使用复选框或选择多个,都不起作用。我已经尝试为每种可能的选择组合编写一个带有多个 if 语句的视图函数,它可以工作,但这绝对是一种不好的做法。 我正在阅读 Django 教程,但仍然没有找到解决我认为这是一个简单问题的方法。
#my models.py
class Game(models.Model):
name = models.CharField(max_lenght=100)
platform = models.CharField(max_lenght=100)
is_free = models.BooleanField(default=True)
genre = models.CharField(max_lenght=100)
#my views.py
def index(request):
platform = request.GET.get('platform')
is_free = request.GET.get('is_free')
genre = request.GET.get('genre')
if platform is not None:
games = games.filter(platform=platform, is_free=is_free, genre=genre)
return render(request, 'index_games.html', {'games': games})
/*this is index_games*/
{% extends 'base.html' %}
{% block content %}
<h1>Games</h1>
<form method="get" action="/games/">
<h5>Choose platform</h5>
/*only one choice is allowed here*/
<select name="platform">
<option value='PS4'>PS4</option>
<option value="XBOX">XBOX</option>
<option value='Switch'>Switch</option>
</select>
/*here's the problem, multiple choices should be allowed for is_free and genre
but are not*/
<h5>Free to Play?</h5><br/>
<input type="checkbox" name="is_free" value="True" checked>Free<br/>
<input type="checkbox" name="is_free" value="False">For sale<br/>
<h5>Genre</h5>
<input type="checkbox" name="genre" value="Shooter">Shooter<br/>
<input type="checkbox" name="genre" value="Adventure">Adventure<br/>
<input type="checkbox" name="genre" value="Strategy">Strategy<br/>
<hr/>
</form>
<div class="row">
{% for game in games %}
<h1>{{game.name}}
{% endfor %}
</div>
{% endblock %}
即使选中了多个复选框,也只会返回与选中的最后一个值匹配的结果。我认为问题是由于在不同的输入中给出相同的名称(例如:name="genre" 为多个输入重复),所以我尝试命名这些genre1、genre2、genre3 并像这样重写:
def index(request):
platform = request.GET.get('platform')
is_free = request.GET.get('is_free')
genre = request.GET.get('genre')
if platform is not None:
games = games.filter(platform=platform, is_free=is_free, genre=genre1, genre2, genre3)
return render(request, 'index_games.html', {'games': games})
但我收到“未解决的参考”错误。 非常感谢任何帮助或建议。
【问题讨论】: