2017-02-24 35 views
0

所以我正在爲我的django應用程序構建搜索功能。我有一個request.GET表單,我從中抽取變量以插入模型中的各種過濾器。我目前的設置如下:使用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, 
}) 

所以我有用戶選擇他們是從多項選擇框進行搜索,加息的難度,並插入到我的過濾器(其中難度是Hike模型的一個領域)。但是,我想要一個不使用此過濾器的選項,並返回所有(所以從多選框中,用戶將選擇「全部」)。我爲什麼要插入過濾器以便忽略過濾器(或者只是全部返回)?還是有更好的方法來構造這個?

回答

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,海拔= formelevation)等等,我從表單中拉出每個變量。有沒有辦法做到這一點,而不必創建多個「if」語句? – Josh

+2

@Josh - 我已經更新了我的答案,它可能是值得創建一個不同的字典,而不是隻是request.GET,有更好的驗證 – Sayse

+2

這就是'django.forms'的驗證方面通常用於即使你是不使用它來呈現HTML –