Django:如何检查模板中的字段小部件是否为复选框?

mpe*_*pen 8 django django-templates

我已经创建了一个用于渲染表单字段的自定义模板:

<tr class="{{field.field.widget.attrs.class}}">
    <th class="label">
        <label for="{{field.auto_id}}">
            {{field.label}}
            {% if not field.field.required %}<span class="optional">(optional)</span>{% endif %}
        </label>
    </th>
    <td class="field">
        {{field}}
        {% if field.errors %}<label class="error" for="{{field.auto_id}}">{{field.errors.0}}</label>{% endif %}
        {% if field.help_text %}<small class="help-text">{{field.help_text}}</small>{% endif %}
    </td>
</tr>
Run Code Online (Sandbox Code Playgroud)

但我想检查小部件是否是一个复选框,如果是,则以不同方式呈现它.我怎么能在模板中做到这一点?

dav*_*gsu 15

使用自定义模板过滤器!

yourapp/templatetags/my_custom_tags.py:

from django import template
from django.forms import CheckboxInput

@register.filter(name='is_checkbox')
def is_checkbox(field):
  return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__
Run Code Online (Sandbox Code Playgroud)

在您的模板中:

{% load my_custom_tags %}

{% if field|is_checkbox %}
  do something
{% endif %}
Run Code Online (Sandbox Code Playgroud)

关于实现的附注:当我没有实例化CheckboxInput时,类名是MediaDefiningClass.

>>> form django.forms import CheckboxInput
KeyboardInterrupt
>>> CheckboxInput.__class__.__name__
'MediaDefiningClass'
Run Code Online (Sandbox Code Playgroud)

  • 今天有一个特殊的Django实用程序,它有类似的检查器和其他东西:https://pypi.python.org/pypi/django-form-utils#is-checkbox (4认同)
  • 我会说使用这样的东西更干净:`return isinstance(field.field.widget, CheckboxInput)`。 (2认同)

Jef*_*oft 8

{{ field.field.widget.input_type }}会得到很多小部件的这些信息,但不是全部.我不确定它是否适用于默认复选框小部件.值得一试.


Ale*_*dre 7

回答起来有点迟,但我实现了类似于Django管理员所做的事情.

首先,我向is_checkboxField类添加了一个新属性:

# forms.py
from django import forms
from django.forms.fields import Field
setattr(Field, 'is_checkbox', lambda self: isinstance(self.widget, forms.CheckboxInput ))
Run Code Online (Sandbox Code Playgroud)

然后,我可以轻松地检测CheckboxInput模板中的小部件.这是一个向左渲染复选框和向右渲染其他窗口小部件的示例:

{% if field.field.is_checkbox %}
    {{ field }} {{ field.label_tag }}
{% else %}
    {{ field.label }} {{ field }}
{% endif %}
Run Code Online (Sandbox Code Playgroud)