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

Django新手-使用多字段表单,如何消除queryset中的空字段,django,django-forms,django-queryset,Django,Django Forms,Django Queryset,我是Django新手,如果这是个愚蠢的问题,请原谅我。我有一个搜索表单,上面有多个字段。我只希望通过提交的非空字段筛选查询集。我该怎么做?我知道可以将QuerySet和Q对象链接在一起,但我不知道如何从链中消除空的键/值对。我知道下面的方法行不通,但我想它可能会让我了解我在寻找什么。多谢各位 def art_search(request): if request.method == 'GET': form = AdvSearch(request.GET)

我是Django新手,如果这是个愚蠢的问题,请原谅我。我有一个搜索表单,上面有多个字段。我只希望通过提交的非空字段筛选查询集。我该怎么做?我知道可以将QuerySet和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,
    })
你可以写:

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)

如果筛选参数的名称与表单字段的名称相同。

我发现一个简单的方法是创建一个字典,如:

query_dict = { 'marketingname' : art_name , 'marketingnumber'=art_number}
然后利用python的kwargs语法将其很好地传递进来,即

Inventory.objects.filter(**query_dict)
要构建初始字典,如果清除的数据键与传递给
filter()
的参数相对应,则可以使用列表理解

但这里的情况似乎并非如此(MarketingName!=artname)

您可以尝试:

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
这应该起作用:


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

我先写了同样的内容:/我的答案并不完全多余。它演示了列表理解和dict()。哲库杰:)
try:
    artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
except:
    # do some error handling