首页 文章

Django新手 - 使用多字段表单,如何消除查询集中的空字段

提问于
浏览
0

我是Django的新手,所以如果这是一个愚蠢的问题,请原谅我 . 我有一个搜索表单,上面有多个字段 . 我只希望通过提交的非空的字段过滤我的查询集 . 我怎么做?我知道你可以将查询集和Q对象链接在一起,但我不知道如何从链中消除空键/值对 . 我知道以下内容不起作用,但我认为它可以提供我正在寻找的内容 . 谢谢 .

def art_search(request):
    if request.method == 'GET':
        form = AdvSearch(request.GET)
        if form.is_valid():
            art_name = form.cleaned_data['art_name']
            art_number = form.cleaned_data['art_number']
            artwork = Inventory.objects.filter(
                if art_name is not u'':
                    Q(marketingname=art_name),
                if art_number is not u'':
                    Q(marketingnumber=art_number)
            )
            return object_list(request, queryset=artwork)
    else:
        form = AdvSearch()
    return render_to_response('art/search.html', {
        'form': form,
    })

4 回答

  • 2

    你可以写:

    if form.is_valid():
        opts = {}
        for key in form.cleaned_data:
            if form.cleaned_data[key] != '':
                opts[key] = form.cleaned_data[key]
        artwork = Inventory.objects.filter(**opts)
        return object_list(request, queryset=artwork)
    

    如果过滤器参数与表单字段具有相同的名称 .

  • 0

    我发现一些简单的东西是创建一个字典,如:

    query_dict = { 'marketingname' : art_name , 'marketingnumber'=art_number}
    

    然后利用python的kwargs语法很好地传递它,即

    Inventory.objects.filter(**query_dict)
    

    要构建初始字典,如果您的cleaning_data键对应于您传递给 filter() 的参数,则可以使用列表解析 .

    query_dict = dict([ (k,v) for k,v in form.cleaned_data.items() if v ])
    

    但这似乎并非如此(markettingname!= artname)

  • 0

    你可以尝试做:

    if art_name != '' and art_number != '':  
        artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
    

    如果你使用尝试更好

    try:
        artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
    except:
        # do some error handling
    
  • 0

    这应该工作:

    Inventory.objects.filter(Q(marketingname = art_name)| Q(marketingnumber = art_number))

相关问题