【问题标题】:Django form searchDjango 表单搜索
【发布时间】:2011-12-08 12:49:08
【问题描述】:

我正在 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、参数。

我意识到这个字段是 unicode 并尝试使用 str(...) 或 encode('ascii',...) 转换它,但它仍然给我同样的错误。我是 django 的新手,所以任何帮助将不胜感激。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

    如果 Group 模型(您没有发布,所以这是有根据的猜测)包含小写的 name 字段,上面的查询将在尝试访问大写的 NAME 字段时生成您发布的错误.

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

    【讨论】:

      【解决方案2】:

      要查找您的错误代码,请替换此代码:

      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)
      

      【讨论】: