ModelForm クラスを使用して検索フォームを作成しようとしています。これにより、ユーザーは単一フィールドのキーワード検索ではなく、特定のフィールドでモデル内の値を検索できます。また、空のフィールドを無視したいです。
Haystack や Djapian などの検索エンジン オプションを調べたり、Django で手動で問題にアプローチしたりしましたが、複数のフィールドでクエリを実行したときに結果を取得できないようです。
これは、文書化されているものに加えて、このサイトのいくつかの同様の質問への回答に部分的に基づいて、私がこれまでに持っているビューです。
def search(request):
error = False
form = InfoForm()
if 'field1' or 'field2' or 'field3' in request.GET:
form = InfoForm(request.GET)
if form.is_valid():
cd = form.cleaned_data
field1 = cd['field1']
field2 = cd['field2']
field3 = cd['field3']
if not(field1 or field2 or field3):
error = True
else:
query = Q()
if request.GET['field1']:
query &= Q(field1__icontains=request.GET['field1'])
if request.GET['field2']:
query &= Q(field2__icontains=request.GET['field2'])
if request.GET['field3']:
query &= Q(field3__icontains=request.GET['field3'])
results = PersonInfo.objects.filter(query).distinct()
return render_to_response('search/personsearch.html',
{'query': query,
'field1': field1,
'field2': field2,
'field3': field3,
'results': results,
},
context_instance=RequestContext(request))
return render_to_response('search/infosearch.html',
{'error': error,
'form': form},
context_instance=RequestContext(request))
ドキュメントから直接この複雑なクエリも試しました。
query = InfoModel.objects.get(
Q(field1__icontains=field1) |
Q(field2__icontains=field2) |
Q(field3__icontains=field3)
)
どちらの場合も、クエリ文字列?field1=&field2=&field3=
が URL に追加されているように見え、期待どおり、フィールドに指定されたフィールド値を含むページが返されます。ただし、すべてのフィールドが空白のままの場合は、結果を返すこともエラーを生成することもありません。
私は明らかに何かが欠けていますが、私の人生では何がわからないのですか。他の誰かがこの問題に遭遇しましたか?