从模板中获取Django表单小部件的类型

Oli*_*Oli 42 django django-templates django-forms

我正在遍历表单的字段,对于某些字段,我想要稍微不同的布局,需要更改HTML.

要准确地做到这一点,我只需要知道小部件类型.它的类名或类似的东西.在标准的python中,这很容易!field.field.widget.__class__.__name__

不幸的是,您不允许访问模板中的下划线变量.大!

可以测试,field.field.widget.input_type但这仅适用于文本/密码<input ../>类型.我需要更多的解决方案.

对我而言,无论它看起来多么困难,最适合在模板级别执行此操作.我已经将处理字段HTML的代码外包给了一个单独的模板,该模板包含在字段循环中.这意味着它在ModelForms和标准Forms 之间是一致的(如果我写了一个中间的Form类,这是不正确的).

如果您能看到一种不需要我编辑20多种形式的通用方法,请告诉我!

rin*_*nti 43

制作模板标签可能有效吗?就像是field.field.widget|widget_type

来自Oli的编辑:好点!我刚写了一个过滤器:

from django import template
register = template.Library()

@register.filter('klass')
def klass(ob):
    return ob.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

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

从Oli#2编辑:我需要在if-statetement in-template中使用它的结果,所以我只是将所有逻辑转移到templatetag中.魔法.谢谢你朝着正确的方向戳我.


zlo*_*ady 35

按照接受的答案 - if tagDjango 1.2中的增强功能允许您在if tag比较中使用过滤器.所以您现在可以在模板中执行自定义html /逻辑,如下所示:

<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>
Run Code Online (Sandbox Code Playgroud)


Pio*_*icz 19

根据Oli和rinti的回答:我使用了这个,我觉得它有点简单:

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

过滤代码:

from django import template
register = template.Library()

@register.filter('fieldtype')
def fieldtype(field):
    return field.field.widget.__class__.__name__
Run Code Online (Sandbox Code Playgroud)


Iva*_*gai 16

从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 %}
Run Code Online (Sandbox Code Playgroud)