2011-10-15 43 views
1

我正在在Django搜索表单,但我是在我看来处理表单挣扎。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,名称,参数。

我意识到,这个字段是unicode的,并试图通过str将其转换(...)或编码(“ASCII”,...),但它仍然给了我同样的错误。我是django的新手,所以任何帮助,将不胜感激。

感谢

回答

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) 
0

它抱怨有(大写)NAME字段,并且通过错误消息的格式判定,它是触发它的查询。我真的不能从您的代码告诉我们,但在某些时候我觉得你执行的相当于下列:

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

如果组模式(你没有张贴,所以这是一个受过教育的猜测)包含一个小写字母name,上述查询会在您尝试访问大写字段NAME字段时生成您发布的错误。

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