我已经创建了一个用于渲染表单字段的自定义模板:
<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>
但是我想检查小部件是否是一个复选框,如果是,则以不同方式呈现它。我怎么能在模板中做到这一点?
答案 0 :(得分: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__
在你的模板中:
{% load my_custom_tags %}
{% if field|is_checkbox %}
do something
{% endif %}
关于实现的附注:当我没有实例化CheckboxInput时,类名是MediaDefiningClass。
>>> form django.forms import CheckboxInput
KeyboardInterrupt
>>> CheckboxInput.__class__.__name__
'MediaDefiningClass'
答案 1 :(得分:8)
{{ field.field.widget.input_type }}
会为很多小部件提供此信息,但不是全部。我不确定它是否适用于默认复选框小部件。值得一试。
答案 2 :(得分: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 %}