2013-08-23 31 views
2

在我的Django支持的網站上,我有一個包含多個可選字段的搜索頁面。該搜索頁面是一個Django的形式,我認爲功能是典型的:請勿在Django表單發出的GET請求中包含空白字段

def search(request): 
    form = SearchForm(request.GET or None) 
    if form.is_valid(): 
     return form.display_results(request) 

    return render(request, 'search.html', {'form': form}) 

Form.display_results()使用提供查詢數據庫,並呈現一個響應的字段。我search.html包括:

<form action="/search/" method="get">{% csrf_token %} 
    <!-- Render the form fields --> 
    <input type="submit" value="Search" /> 
    <input type="reset" value="Reset form" /> 
</form> 

由於大多數的搜索會存在空白字段,我想沒有將其包括在上search.html提交按鈕發出GET請求。當前的搜索看起來像:

http://mysite/search/?csrfmiddlewaretoken=blah&optional_field1=&optional_field2=&optional_field3=oohIWantThisOne 

而且我想他們是這樣的:

http://mysite/search/?csrfmiddlewaretoken=blah&optional_field3=oohIWantThisOne 

當然,我有幾個領域。這樣做會很好,因爲它可以使搜索URL更容易人爲分析和共享。

回答

4

您可以使用帶按鈕觸發器的jQuery。提供表單並提交按鈕ID。

$("#button_id").click(function(){ 
    $("input").each(function(){ 
     if($(this).val() == '') { 
      $(this).remove(); 
     } 
    }); 
    $("#form_id").submit(); 
}); 

(或類似的)應該在提交之前刪除所有空字段。

+0

此方法的問題是,如果表單由於某種原因(例如驗證)未提交,則這些輸入將消失。也許你可以直接將函數附加到'submit'方法。 –

+0

右鍵 - 瀏覽器在窗體上提交所有成功的控件(http://www.w3.org/TR/html401/interact/forms.html#h-17.13.2),所以這個工作的唯一方法是使用Javascript某種方式去除或停用不必要的控制。另外請注意,如果您打算傳遞這些URL,您實際上不希望您的CSRF令牌存在於其中。 GET請求忽略CSRF令牌,但它仍然是不必要的,也是不好的做法。 –

+0

我真的認爲其他解決方案,發佈表單,更清潔。 –

1

您也可以發佈表單。然後建立搜索網址,並刪除空值的重定向。

+0

關於使用'POST'的煩人的事情是,不能與預先填充的搜索參數共享一個鏈接,甚至不在網站上的視圖之間(至少沒有JavaScript技巧)。這很煩人。 – Deleet

+0

因此,使用POST數據來構建url參數,忽略空的參數。然後,該網址可收藏。 –