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

10 投票
3 回答
12864 浏览
提问于 2025-04-16 05:26

我创建了一个自定义模板,用来显示表单字段:

<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>

但是我想检查一下这个小部件是不是复选框,如果是的话,我想用不同的方式来显示它。我该怎么在模板里做到这一点呢?

3 个回答

7

虽然现在回答有点晚,但我做了一个和Django后台类似的东西。

首先,我在Field类里添加了一个新的属性 is_checkbox

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

接着,我就可以很方便地在模板中检测到 CheckboxInput 这个小部件。下面是一个例子,展示了如何把复选框放在左边,其他小部件放在右边:

{% if field.field.is_checkbox %}
    {{ field }} {{ field.label_tag }}
{% else %}
    {{ field.label }} {{ field }}
{% endif %}
12

{{ field.field.widget.input_type }} 这个代码可以帮你获取很多小部件的信息,但并不是所有的小部件都适用。我不确定它是否适用于默认的复选框小部件,不过试试看也没坏处。

20

使用一个自定义模板过滤器!

yourapp/templatetags/my_custom_tags.py文件中:

from django import template
from django.forms import CheckboxInput

register = template.Library()

@register.filter(name='is_checkbox')
def is_checkbox(field):
  return field.field.widget.__class__.__name__ == CheckboxInput().__class__.__name__

在你的模板里:

{% load my_custom_tags %}
 
{% if field|is_checkbox %}
  do something
{% endif %}

补充说明一下实现:当我不实例化CheckboxInput时,类名是MediaDefiningClass。

>>> form django.forms import CheckboxInput
KeyboardInterrupt
>>> CheckboxInput.__class__.__name__
'MediaDefiningClass'

撰写回答