Django Newbie - 使用多字段表单,如何消除查询集中的空字段
Posted
技术标签:
【中文标题】Django Newbie - 使用多字段表单,如何消除查询集中的空字段【英文标题】:Django Newbie - With a multiple fields form, how do I eliminate empty fields within the queryset 【发布时间】:2011-01-17 05:17:29 【问题描述】:我是 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,
)
【问题讨论】:
【参考方案1】:你可以写:
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)
如果过滤器参数与表单字段同名。
【讨论】:
【参考方案2】:我发现一些简单的方法是创建一个字典,例如:
query_dict = 'marketingname' : art_name , 'marketingnumber'=art_number
然后利用python的kwargs语法很好地传递它,即
Inventory.objects.filter(**query_dict)
如果您的cleaned_data 键对应于您传递给filter()
的参数,您可以使用列表解析来构建初始字典。
query_dict = dict([ (k,v) for k,v in form.cleaned_data.items() if v ])
但这里的情况似乎并非如此 (marketingname != artname)
【讨论】:
我先在下面写了同样的内容:/ 我的回答并非完全多余。它演示了列表推导和 dict()。 Dziekuje :)【参考方案3】:你可以试试:
if art_name != '' and art_number != '':
artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
如果你使用 try 会更好
try:
artwork = Inventory.objects.filter(marketingname = art_name, marketingnumber = art_number)
except:
# do some error handling
【讨论】:
【参考方案4】:这应该可行:
Inventory.objects.filter(Q(marketingname=art_name) | Q(marketingnumber=art_number))
【讨论】:
以上是关于Django Newbie - 使用多字段表单,如何消除查询集中的空字段的主要内容,如果未能解决你的问题,请参考以下文章
多对多字段的 Django 表单上的逗号分隔文本而不是多项选择
Django admin - 如何在自定义管理表单中为多对多字段添加绿色加号
如何在 django 中制作一个类似于谷歌表单的表单?用户可以在哪里根据需要添加或删除字段?用户最多可以添加10-20个字段?