2011-10-15 41 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的評論已經爲如何確定這一點提供了一個很好的細分。