使用模板生成Django动态页面

时间:2013-04-04 12:06:42

标签: python html django django-templates checkbox

我想使用模板和内容块生成页面。主页生成一组复选框,以便为某些特定值生成搜索查询。

<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'循环再次执行。有没有办法防止这种情况发生,而不是将复选框硬编码到我的模板中?这可以工作(我用一些复选框做了,但是用太多的搜索值来做这件事并不好玩。另外我想避免额外的数据库命中并再次传递参数。

1 个答案:

答案 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变量只包含两个视图中这些对象的名称,它看起来像是当前的对象列表。同样,是否真的有必要避免该查询?