【问题标题】:Django dynamic page generation with templates使用模板生成 Django 动态页面
【发布时间】:2013-03-26 11:52:39
【问题描述】:

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

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

【问题讨论】:

  • 你在用 django Form
  • 不,所有 html 都是在单独的 .html 文件中完成的。
  • 你为什么不使用Form?这将使输出模板中的字段变得非常简单,因为这是它的设计目的。
  • 先按自己的方式做肯定无济于事。最好的办法是尝试 d​​jango 的方式,如果它不适合你,就按照你的方式去做。最终你会回来看看 django 可以做什么,也许会找到更好的方法来做事。至于sql... Django 的ORM 非常强大,实际上只需要很少的sql。将来您可能需要进行原始查询,但是如果您使用的是 Django,则应该利用它的功能...
  • 如果您还没有,您应该通过tutorial 真正地工作,它涵盖了很多主题,可以让您很好地开始。

标签: python html django django-templates checkbox


【解决方案1】:

我同意上面的 cmets,使用表单几乎总是一个更好的主意。但是针对您的问题,如果您没有将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 变量在两个视图中只保存这些对象的名称,它看起来像是当前的对象列表。同样,是否真的有必要避免该查询?

【讨论】:

  • 我故意把这部分去掉,希望已经生成的复选框保持不变。额外的请求可能没有问题,特别是因为我的 sql 查询有不同的问题:( ...使用比萨配料多对多字段示例:我想找到所有使用配料 T1 的比萨饼, T2、T3 和 T4(他们可以有更多,但必须有这些浇头)。我之前用自己创建的查询(使用连接和子选择,它能够处理许多浇头),但我想用 django 来做-way. 然而,我不知道该怎么做
  • 隐藏的复选框对我已经使用的普通复选框不是多余的吗?每个复选框的名称都是相同的,所以我已经使用 bar = request.GET.getlist('foovar')。我可能没有明确说明每个复选框都是一样的,我的道歉。但是,我开始研究 Form,稍后会看看这个我仍然在努力解决的问题。
  • @user1451340 如果我理解正确,“栏”应该包含所有复选框,而不仅仅是选定的复选框。如果您不添加隐藏输入,您将只会获得选定的输入。不提交未选中的复选框。关于您对查询的疑问,如果您发布有关当前尝试的问题并解释您想要获得的内容,我相信您会得到快速帮助。
  • 是的,我已经想出如何在提交后保持选中的复选框处于选中状态,并传递附加数据。最初我试图避免这种情况,但这似乎不可能像我试图去的那样。一旦我回到性能不佳的地方,我就会发布我的查询问题,现在我必须研究 django 表单模块,以及如何使用它。感谢您的帮助! :)
猜你喜欢
  • 2019-12-13
  • 2015-11-23
  • 2012-06-07
  • 2014-06-20
  • 2012-04-30
  • 1970-01-01
  • 2019-10-30
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多