2017-02-24 4 views
0

私は私のdjangoアプリケーションの検索機能を構築しています。私はリクエストを受け取りました。私のモデルではさまざまなフィルタにプラグインするための変数を取得しています。次のように私の現在の設定は次のとおりです。Model.object.filter(field = '??')を使用してDjangoですべてを返す

views.py:

def search(request): 
    grade = request.GET.get('g', '') 
    test = Hike.objects.filter(difficulty=grade) 
    return render(request, 'hikes/hike_list.html', { 
     'test': test, 
}) 

だからここで(私は、ユーザーが複数の選択肢ボックスから探しているハイキングの難易度を選択する必要があり、それが私のフィルタに差し込みます難易度はハイケモデルの分野です)。しかし、私はこのフィルタを使用せず、すべてを返すオプションが必要です(したがって、複数選択ボックスから、「All」を選択します)。そのフィルタを無視する(またはすべてを返す)ために、フィルタに何を挿入すればよいですか?それとも、これを構造化する良い方法がありますか?

答えて

1

それを実装するための良い方法は、私も、複数のフィルタを使用しているクエリセット

def search(request): 

    qs = Hike.objects.all() 

    if request.method == 'GET': 

     grade = request.GET.get('g', '') 

     if grade: 
      qs = qs.filter(difficulty=grade) 

    return render(request, 'hikes/hike_list.html', { 
      'test': qs, 
    }) 
+0

これは完璧です!もう一つの答えはうまくいくようですが、私は比較的新しいdjangoですが、これはずっと簡単です。ありがとうございました! – Josh

2

ユーザーがクエリを実行しない場合は、要求を送信するときにクエリパラメータを含めないでください。バックエンドではグレードを確認するだけです。

grade = request.GET.get('g', '') 
test = Hike.objects.all() 
if grade: 
    test = test.filter(difficulty=grade) 

if文を避ける簡単な方法はありますか?モデルが予期しているのではなく、クエリーパラメータのリストを返信して、アンパックを使用してパラメータの辞書をクエリーセットに渡すことができます。

# request.GET could be {difficulty: '1', foo: 'bar'} 
if request.GET: 
    test = Hike.objects.filter(**request.GET) 
+0

連鎖されます。だから私はそれらを一緒に連鎖している:Hike.objects.filter(難度= formgrade、id = formid、elevation = formelevation)などどこでフォームからこれらの変数を引っ張っている。複数の "if"ステートメントを作成しなくてもこれを行う方法はありますか? – Josh

+2

@Josh - 私は自分の答えを更新しました。リクエストの代わりに別の辞書を作る価値があります.GETのほうがより良い確認があります。 – Sayse

+2

これは 'django.forms'のバリデーションアスペクトが、 HTMLをレンダリングするためにそれを使用していません –

関連する問題