带过滤的表单

时间:2017-10-30 13:59:00

标签: django

我尝试通过表单为查询设置一些过滤功能,但我真的不知道如何构建它。

所以我想通过"招聘","游戏"和/或"平台"。问题是我真的不知道如何在我的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是什么?

感谢您的帮助,请问我是否不清楚!

1 个答案:

答案 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表单,但是如果你还没有完成整个教程,那么它是值得的。