我尝试通过表单为查询设置一些过滤功能,但我真的不知道如何构建它。
所以我想通过"招聘","游戏"和/或"平台"。问题是我真的不知道如何在我的views.py中构建它。
template.html
<form method="POST">
{% csrf_token %}
<select name="recruitment" onchange=this.form.submit();>
<option disabled {%if form.recruitment == Null%}selected{%endif%}>Recrutement</option>
<option value="all" {%if form.recruitment == "all"%}selected{%endif%}>Tout</option>
<option value="open" {%if form.recruitment == "open"%}selected{%endif%}>Ouvert</option>
<option value="close" {%if form.recruitment == "close"%}selected{%endif%}>Fermé</option>
</select>
<select name="plateform" onchange=this.form.submit();>
<option disabled {%if form.plateform == Null%}selected{%endif%}>Plateforme</option>
<option value="all" {%if form.plateform == "all"%}selected{%endif%}>Toutes</option>
{%for plateform in plateform%}
<option value="{{plateform.guid}}" {%if form.plateform == plateform.guid%}selected{%endif%}>{{plateform.name}}</option>
{%endfor%}
</select>
<select name="game" onchange=this.form.submit();>
<option disabled {%if form.game == Null%}selected{%endif%}>Jeu</option>
<option value="all" {%if form.game == "all"%}selected{%endif%}>Tous</option>
{%for game in game%}
<option value="{{game.guid}}" {%if form.game == game.guid%}selected{%endif%}>{{game.title}}</option>
{%endfor%}
</select>
</form>
views.py
def view_watch_teams(request):
media = settings.MEDIA
try:
myteam = Team.objects.get(owner=request.user)
except:
pass
team = Team.objects.all()
game = Games.objects.all()
plateform = Plateform.objects.all()
if request.POST:
form = request.POST
我的查询应该是这样的:
result = Relation.objects.filter(recruitment=form['recruitment'], on_game=form['game'], on_plateform=form['plateform'])
此类查询仅在设置了所有过滤器时有效。那么,使查询更具动态性的正确的synthax是什么?
感谢您的帮助,请问我是否不清楚!
答案 0 :(得分:0)
您可以利用QuerySet过滤可以链接的事实:
MyModel.objects.filter(field_1=val_1).filter(field_2=val_2)
相当于:
MyModel.objects.filter(field_1=val_1, field_2=val_2)
所以你可以这样做:
result = Relation.objects.all()
if request.POST:
recruitment = request.POST.get('recruitment', None)
if recruitment:
result = result.filter(recruitment=recruitment)
game = request.POST.get('game', None)
if game:
result = result.filter(on_game=game)
plateform = request.POST.get('plateform', None)
if plateform:
result = result.filter(on_plateform=plateform)
如果您想简化代码,节省一些维护难题并沿途学习Django,您可以用Django表单替换手工制作的表单。
Django表单有几个优点:主要是Django生成HTML,在选择字段和复选框组中填充项目,在需要时验证数据(向用户显示一些简洁的错误消息),并自动将GET / POST数据转换为正确的Python对象。
Django项目的网站上有一个very good tutorial。第4部分是关于Django表单,但是如果你还没有完成整个教程,那么它是值得的。