我想使用模板和内容块生成页面。主页生成一组复选框,以便为某些特定值生成搜索查询。
<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})
结果是结果,p包含查询的值(保留提交后复选框)。
{% extends "testlink/foobar.html" %}
{% block content %}
<b>results:</b> <br>
{% for result in result %}
{{result.someattribute}}<br>
{% endfor %}
{% endblock %}
现在,我的问题:复选框消失了,可能是因为'for foo in bar'循环再次执行。有没有办法防止这种情况发生,而不是将复选框硬编码到我的模板中?这可以工作(我用一些复选框做了,但是用太多的搜索值来做这件事并不好玩。另外我想避免额外的数据库命中并再次传递参数。
答案 0 :(得分: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
变量只包含两个视图中这些对象的名称,它看起来像是当前的对象列表。同样,是否真的有必要避免该查询?