Django 表单搜索

1 投票
2 回答
1166 浏览
提问于 2025-04-17 04:24

我正在用Django做一个搜索表单,但在处理视图中的表单时遇到了困难。

我的代码:

class SearchForm(forms.Form):
    name = forms.CharField(label="Name", max_length=64, required=False)
    ...
    <a few other fields>


def search(request):
    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            name = form.cleaned_data['name']
            qdict = { 'name': name}
            q_objs = [Q(**{qdict[k]: form.cleaned_data[k]}) for k in qdict.keys() if form.cleaned_data.get(k, None)]
            search_results = Group.objects.select_related().filter(*q_objs)
            response = {'success' : search_results}
            return HttpResponse(simplejson.dumps(response, ensure_ascii=False), mimetype='application/javascript')
    else:
        form = SearchForm()
    return render_to_response("main/search.html", {'form': form},
      context_instance=RequestContext(request))

我遇到了这个错误:无法将关键字u'NAME'解析为字段。可选项有:date_submitted, id, name, parameters。

我发现这个字段是以unicode格式存在的,尝试用str(...)或者encode('ascii',...)来转换,但还是出现了同样的错误。我是Django的新手,所以任何帮助都非常感谢。

谢谢

2 个回答

0

它提到的是大写的 NAME 字段,根据错误信息的格式来看,是查询导致了这个问题。我从你的代码中看不出来,但我觉得在某个地方你执行了类似下面的操作:

Group.objects.filter(NAME='some_value')

如果你的 Group 模型(你没有提供这个,所以我只是猜测)里面有一个小写的 name 字段,那么上面的查询就会产生你看到的错误,因为它试图访问大写的 NAME 字段。

所以我想问题的关键是:最终的查询是什么样子的?关于这一点,danihp 的评论已经很好地解释了如何确定这一点。

1

要找到你的错误代码,把这段代码替换成:

name = form.cleaned_data['name']
qdict = { 'name': name}
q_objs = [Q(**{qdict[k]: form.cleaned_data[k]}) for k in qdict.keys() if form.cleaned_data.get(k, None)]
search_results = Group.objects.select_related().filter(*q_objs)

用这段代码:

q=None
for k,v in form.cleaned_data.items():
  if q:
    q &= Q( k = v )
  else:
    q = Q( k = v )
search_results = Group.objects.select_related().filter( q )

不过,要真正掌控你的查询,你需要一条一条地写条件:

qs = []

name = form.cleaned_data['name']
if name:
  q_name = Q( name__contains = name )
  qs.append(q_name)

fromDate = form.cleaned_data['fromDate']
if fromDate:
  q_from = Q( date__gte = fromDate )
  qs.append(q_from)

toDate = form.cleaned_data['toDate']
if toDate:
  q_toDate = Q( date__gte = toDate )
  qs.append(q_toDate)

q=None
for x in qs:
  if q:
    q &= x
  else:
    q = x

search_results = Group.objects.select_related().filter(q)

撰写回答