我正在遍历表单的字段,对于某些字段,我希望布局略有不同,需要更改HTML。
为了准确地做到这一点,我只需要知道小部件类型。它的类名或类似名称。在标准python中,这很容易!field.field.widget.__class__.__name__
field.field.widget.__class__.__name__
不幸的是,你不允许访问模板中的下划线变量。大!
你可以进行测试,field.field.widget.input_type但这仅适用于文本/密码<input ../>类型。我需要更多的分辨率。
field.field.widget.input_type
<input ../>
对我而言,无论看起来多么困难,在模板级别执行此操作都是最有意义的。我已经将处理字段的HTML的部分代码外包给了包含在字段循环中的单独模板。这意味着它在ModelForms和standard上是一致Form的(如果我写了一个中间Form类,那是不对的)。
ModelForms
从Django 1.11开始,你可以使用widget.input_type。例:
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
field.field.widget|widget_type
来自Oli的编辑:好点!我刚刚写了一个过滤器:
from django import template register = template.Library() @register.filter('klass') def klass(ob): return ob.__class__.__name__
现在可以{{ object|klass }}正确渲染。现在,我只想弄清楚如何在模板的if语句中使用它。
{{ object|klass }}
从Oli#2进行编辑:我需要在if陈述模板中使用该结果,因此我只是将所有逻辑转移到了templatetag中。魔法。感谢你向正确的方向戳我。