2013-08-19 55 views
0
定義

我有以下觀點:過濾器僅當該值在Django

def process(request): 
    if request.method == 'POST': 
     data = request.POST 
     results = Specs.objects.filter(screenGroup = data['screen_user'], storage = data['storage_user'], mSystem = data['system_user']) 
     context = {'results' : results} 
     return render(request, 'process.html', context) 

當用戶輸入它正確地濾波這三個值,但是當它只是輸入一個或兩個(或沒有),則它會過濾傳遞值None。如果沒有設置,有沒有辦法忽略過濾器?

謝謝!

編輯:

下面的代碼工作,但它顯然是一個非常效率不高的方法:

def process(request): 
    if request.method == 'POST': 
     data = request.POST 
     if(data['screen_user'] != None): 
      results = Specs.objects.filter(screenGroup = data['screen_user']) 
     elif (data['storage_user'] != None): 
      results = Specs.objects.filter(storage = data['storage_user']) 
     else: 
      results = Specs.objects.all() 
      #plus all the other options... 
     context = {'results' : results} 
     return render(request, 'process.html', context) 
+0

您是不是在做表單提交? – karthikr

+0

不,我通過AJAX(jQuery)傳遞數據。 – Paolo

回答

2

可以預先建立過濾器:

def process(request): 
    if request.method == 'POST': 
     data = request.POST 
     spec_filter = {} 
     for attribute in ['screenGroup', 'storage', 'mSystem']: 
      if attribute in data and data[attribute]: 
       spec_filter[attribute] = data[attribute] 
     results = Specs.objects.filter(**spec_filter) 
     context = {'results' : results} 
     return render(request, 'process.html', context) 

NB:要使用此逐字你將不得不更改request.POST傳遞的變量的名字,以匹配的Specs模式湖我這樣做只是爲了說明,但你可以很容易地使用與你的變量名稱相同的原則。在這種情況下,你必須稍微詳細些。

+0

順便說一句,我將在未來調查所有表單驗證問題。謝謝! – Paolo

2

這就是所謂的validating your form.。有兩種方法可以做到這一點:

  1. 創建一個django表單並使用myform.is_valid()。你可以閱讀一下in the docs

  2. 驗證它自己的幾個「如果」語句(無論是在服務器端或通過JavaScript發送Ajax調用之前)

+0

我知道我必須改變我的表格,不是嗎? – Paolo