Django形式搜索

时间:2011-10-15 22:53:36

标签: python django forms django-forms django-views

我正在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(...)或者编码('ascii',...)转换它,但它仍然给我同样的错误。我是django的新手,所以任何帮助都会受到赞赏。

由于

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

它抱怨(大写)NAME字段,并根据错误消息的格式判断,它是触发它的查询。我无法从你的代码中判断出来,但在某些时候我认为你执行了以下相应的操作:

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

如果Group模型(您没有发布,因此这是一个有根据的猜测)包含一个小写的name字段,上面的查询将生成您在尝试访问大写{{}时发布的错误1}} field。

所以我猜它归结为:最终查询是什么样的?为了获得相关信息,danihp的评论已经为如何确定这一点提供了很好的细分。