Django:For循环迭代表单字段
Posted
技术标签:
【中文标题】Django:For循环迭代表单字段【英文标题】:Django: For Loop to Iterate Form Fields 【发布时间】:2013-10-08 01:22:34 【问题描述】:我不想使用 django 的内置表单生成,试图在我的模板中指定每个字段以自定义 html 输出。
如何遍历一系列表单域?
如果我的表单如下所示:
class MyForm(forms.Form):
main_image = forms.ImageField()
second_image = forms.ImageField()
third_image = forms.ImageField()
fourth_image = forms.ImageField()
...
有没有办法编写一个% for %
循环以便我可以迭代:
form.main_image
form.second_image
form.third_image
form.fourth_image
我尝试了以下看起来合乎逻辑的方法,但没有奏效:
% for field in form %
form.field
% endfor %
【问题讨论】:
【参考方案1】:这显然行不通:
% for field in form %
form.field
% endfor %
但这会:
% for field in form %
field
% endfor %
【讨论】:
非常真实!感谢您指出我的疏忽。将立即接受答案(+1)! 如果我想排除第一个字段而只显示最后一个字段怎么办? @NickB 肮脏的方式:% if forloop.counter != 1 %
,但我认为你最好通过排除表单定义中的字段..【参考方案2】:
最好的方法是使用两个循环,一个用于隐藏字段,一个用于可见字段:
可见:
% for field in form.visible_fields %
field.label
field
% endfor %
隐藏:
% for hidden in form.hidden_fields %
hidden
% endfor %
通过这种方式,您可以更好地控制 UI 元素。
【讨论】:
【参考方案3】:这个应该可以:
% for field in form %
field
% endfor %
一旦您遍历 form 中的字段,您将无法访问 form.field
【讨论】:
好的,谢谢!但我很抱歉@mariodev 先回答了这个问题。但是请 +1 表示感谢! 我不在乎功劳,我很高兴你克服了这个问题 :) 哈哈,谢谢!关于如何排除第一个字段并仅显示其余字段的任何想法? 我会给你一个线索:这都是关于流量控制的【参考方案4】:对于任何希望自定义 Django 表单的前端开发人员,您可以使用名为 django-widget-tweaks
的包来单独呈现字段。示例代码如下:
# Your template with the form #
% extends "base.html" %
% load widget_tweaks %
<form action="" method="POST">
% csrf_token %
% for field in form %
<label for=" field.id_for_label ">
field.label % if field.field.required %*% endif %
</label>
% render_field field %
% endfor %
<button type="button">
Submit Form
</button>
</form>
注意:您当然想让它看起来更漂亮,如果有任何错误,您可能希望循环查看表单错误。
They have some very useful examples 也在他们的 PyPi 页面上。
【讨论】:
以上是关于Django:For循环迭代表单字段的主要内容,如果未能解决你的问题,请参考以下文章