2015-10-17 144 views
1

我想查詢多個條件的數據庫,例如我想從foo作者獲得具有最多評論的特定帖子。這個查詢將非常簡單直接,但我希望用戶指定條件。這意味着,我現在有這樣一個在我的網站上填寫表單:Django中的搜索表單

enter image description here

由於用戶沒有壓力設定任何條件下有可能是空的搜索領域。 (例如他不會選擇英雄)。我現在可以爲每個條件做一個if語句來檢查用戶是否實際提交了一個(if request.POST.get('author')),但是這將會導致代碼太多,我猜...

你們是如何在django中使用這種搜索表單的?任何幫助或建議,高度讚賞!

回答

1

過濾a Django queryset。查詢集是可鏈接的,因此您可以根據用戶指定的條件應用連續的過濾器。具有四個條件if陳述似乎並沒有太過分了:

def search_view(request): 
    results = Guide.objects.all() 

    title = request.POST.get('title') 
    if title: 
     results = results.filter(title__icontains=title) 

    # other conditions... 

    hero = request.POST.get('hero', 'all') 
    if hero != 'all': 
     results = results.filter(hero=hero) 

    render_to_response('search_results.html', {'results': results}) 
+0

這聽起來非常棒!我會盡快實施:D非常感謝! – ZedsWhatSheSaid

1

您可以使用MODEL_NAME.objects.filter(),並提供默認值。

然後,你可以使用__要麼去另一個層面進入關係,或者運行自定義的查詢,如不是等(這裏更多的信息:Django Querysets)小於,大於

例如:

def get_hero(request): 
    if request.method == 'GET': 
     hero_name = request.GET.get('hero_name', 'DEFAULT_HERO') 
     guide_title = request.GET.get('guide_title', 'DEFAULT_TITLE') 

     heros = Hero.objects.filter(hero__name=hero_name, guide__title=guide_title) 

    return render(request, 'template.html', {'heros': heros})