从模板中获取Django表单部件的types

我遍历一个表单的字段和某些领域,我想要一个稍微不同的布局,需要更改的HTML。

为了做到这一点,我只需要知道窗口部件的types。 它的类名或类似的东西。 在标准的Python中,这很容易! field.field.widget.__class__.__name__

不幸的是,你不允许访问模板中的下划线variables。 大!

可以testingfield.field.widget.input_type但这只适用于文本/密码<input ../>types。 我需要更多的解决scheme。

对我而言,无论看起来如何困难,在模板级别做这件事情是最有意义的。 我已经将处理字段的HTML的代码外包给包含在字段循环中的单独模板。 这意味着它在ModelForm和标准Form之间是一致的(如果我编写了一个中间Form类,那么这是不正确的)。

如果你能看到一个通用的方法,不需要我编辑20多个表格,让我知道!

从Django 1.11开始,你可以使用widget.input_type 。 例:

 {% for field in form.visible_fields %} <input type="{{ field.field.widget.input_type }}" id="{{ field.id_for_label }}" name="{{ field.html_name }}" placeholder="{{ field.label }}" maxlength="{{ field.field.max_length }}" /> {% endfor %} 

制作模板标签可能工作? 像field.field.widget|widget_type

从Oli编辑:好点! 我只是写了一个filter:

 from django import template register = template.Library() @register.filter('klass') def klass(ob): return ob.__class__.__name__ 

现在{{ object|klass }}呈现正确。 现在我只需要弄清楚如何在模板的if语句中使用它。

来自Oli#2的编辑:我需要在模板中使用if语句的结果,所以我只是将所有的逻辑移入模板标签。 魔法。 谢谢你正确的方向。

继续接受的答案 – Django 1.2中增强的if tag允许您在if tag比较中使用filter。 所以你现在可以在模板中做你自定义的html / logic:

 <ul> {% for field in form.fields %} <li> {% if field.field.widget|klass == "Textarea" %} <!-- do something special for Textarea --> <h2>Text Areas are Special </h2> {% else %} {{ field.errors }} {{ field.label_tag }} {{ field }} {% endif %} </li> {% endfor %} </ul> 

在Oli和rinti的回答之后:我使用了这个,我认为这有点简单:

模板代码: {{ field|fieldtype }}

过滤代码:

 from django import template register = template.Library() @register.filter('fieldtype') def fieldtype(field): return field.field.widget.__class__.__name__