3

在我的 Django 网站上,我有一个包含几个可选字段的搜索页面。搜索页面是一个django表单,我的视图功能是典型的:

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

4 回答 4

6

您可以将 jQuery 与按钮触发器一起使用。提供表单并提交按钮 ID。

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

那(或类似的东西)应该在提交之前删除所有空字段。

于 2013-08-23T19:09:33.180 回答
2

您也可以发布表格。然后构建搜索 url 并在删除空值的情况下重定向。

于 2013-08-23T19:12:45.837 回答
1

请参阅Bill Erickson 的从 GET 表单中隐藏空字段:

jQuery(document).ready(function($){

  // Remove empty fields from GET forms
  // Author: Bill Erickson
  // URL: http://www.billerickson.net/code/hide-empty-fields-get-form/

  // Change 'form' to class or ID of your specific form
  $("form").submit(function() {
    $(this).find(":input").filter(function(){ return !this.value; }).attr("disabled", "disabled");
    return true; // ensure form still submits
  });

  // Un-disable form fields when page loads, in case they click back after submission
  $("form").find(":input").prop("disabled", false);
}
于 2018-11-13T13:27:00.540 回答
0

免责声明:这是一个非常古老的问题,也是我能找到的唯一一个与我遇到的问题相匹配的问题。完全有可能我的解决方案当时不存在,并且后来添加了更好的方法。

我正在使用 Django 3.2。我不想使用 js/jQuery,也不想使用 POST 表单,所以这就是我想出的。简而言之,它只是检查 GET 数据以查看是否存在任何默认值,并简单地重定向到没有它们的 URL。

在您看来:

from django.shortcuts import redirect

def myView(request):
    if not is_clean_form(request.GET):
        return redirect(whatever_url_path + clean_url_parameters(request.GET))
    else:
        # whatever your view does normally

辅助函数(考虑为您的 Form 类创建这些静态方法,以将所有类型的东西放在一起):

from urllib.parse import urlencode

# fields and their default value (eg. empty string)
default_form_values = [
    ("some_field_name", ""),
    # ...
]

def is_clean_form(form_dict):
    for field, default_value in default_form_values:
        if field in form_dict and form_dict[field] == default_value:
            return False
    return True

def clean_url_parameters(form_dict):
    return "/?" + urlencode([
        (field, form_dict[field]) for (field, default_value) in default_form_values
        if field in form_dict and form_dict[field] != default_value
    ])
于 2021-09-18T14:26:39.093 回答