2013-08-23 32 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参数,忽略空的参数。然后,该网址可收藏。 –