【问题标题】:how to allow the user to filter objects in a database allowing multiple choices for a parameter [duplicate]如何允许用户过滤数据库中的对象,允许参数的多个选择[重复]
【发布时间】: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})

但我收到“未解决的参考”错误。 非常感谢任何帮助或建议。

【问题讨论】:

    标签: python django forms


    【解决方案1】:

    您可以从您的复选框中获取genre 的列表

    genre = request.GET.getlist('genre')
    

    然后像这样过滤

    games = games.filter(platform=platform, is_free=is_free, genre__in=genre)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2013-07-15
      • 2015-01-10
      • 1970-01-01
      • 2015-04-05
      • 2020-10-12
      相关资源
      最近更新 更多