0

我想使用模板和内容块生成一个页面。主页会生成一堆复选框来为某些特定值生成搜索查询。

<div id="searchbar">
  {% for foo in bar %}
    <input type="checkbox" name="foovar" value={{foo.name}}{%if foo.name in p %}checked=checked{%endif%}>{{foo.name}}<br>
  {%endfor%}
  <input type="submit" value="Submit">
</div>
<div id="searchresult">
{% block content %}
{% endblock %}

值 'bar' 是传递给包含所有特定值的模板的参数:

 return render_to_response('testlink/foobar.html',{'bar':strings_from_database})

现在,在提交值后,它们被传递给我的视图,发生了一些神奇的事情,结果通过

 return render(request,'extend/extend.html',{'result':result,'p':queried_values})

result 是结果,p 包含查询的值(在提交后保持复选框处于选中状态)。

 {% extends "testlink/foobar.html" %}
 {% block content %}
 <b>results:</b>  <br>
 {% for result in result %}
     {{result.someattribute}}<br>
 {% endfor %}
 {% endblock %}

现在,我的问题:复选框消失了,可能是因为再次执行了“for foo in bar”循环。有没有办法防止这种情况发生,而无需将复选框硬编码到我的模板中?这会起作用(我用几个复选框做到了,但是用太多的搜索值来做这件事并不好玩。我也想避免额外的数据库命中并再次传递参数。

4

1 回答 1

1

我同意上面的评论,使用表格几乎总是一个更好的主意。但是针对您的问题,如果您没有将bar变量传递给模板,则不会执行解析复选框的循环。您需要添加bar到上下文中extend.html

return render(request,'extend/extend.html',
    {'result':result,'p':queried_values, 'bar':strings_from_database})

你这样做不是为了防止两次击中数据库吗?它是否被证明是一个非常昂贵的查询?

除了设置缓存之外,您始终可以将所有复选框“名称”与表单一起传递。您可以添加隐藏输入,如下所示:

{% for foo in bar %}
    <input type="checkbox" name="foovar" value="{{foo.name}}" {%if foo.name in p %}checked="checked"{%endif%}>{{foo.name}}<br>
    <input type="hidden" name="foovar_all" value="{{foo.name}}" />
{%endfor%}

然后,您需要使用以下内容收集值:

bar = request.POST.getlist('foovar_all')

但是您需要重新考虑您的代码,以便bar变量仅在两个视图中保存这些对象的名称,它看起来像是当前的对象列表。同样,是否真的有必要避免该查询?

于 2013-04-04T13:35:04.457 回答