繁体   English   中英

带有模板的Django动态页面生成

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM