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循环迭代表单字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django视图中使用for循环返回每次迭代[关闭]

Django模板:获取嵌套循环的总迭代次数

来自 % for % 的 Django 模板变量循环到 Javascript

Django MultiWidget 电话号码字段

Django - 一行中的for循环

如何在 django 模板中从 for 循环中转义一行