[英]Django dynamic page generation with templates
我想使用模板和内容块生成页面。 主页会生成一堆复选框,以生成一些特定值的搜索查询。
<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”循环。 有没有一种方法可以避免这种情况发生,而无需将复选框硬编码到我的模板中? 这可以工作(我只用了几个复选框就做到了,但是用太多的searchvalues这样做是没有意思的。另外,我想避免额外的数据库命中并再次传递参数。
我同意以上评论,使用表格几乎总是一个更好的主意。 但是针对您的问题,如果没有将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
变量仅在两个视图中都包含那些对象的名称,看起来它是当前的对象列表。 同样,真的有必要避免该查询吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.