代码之家  ›  专栏  ›  技术社区  ›  mpen

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

  •  8
  • mpen  · 技术社区  · 15 年前

    我创建了一个用于呈现表单域的自定义模板:

    <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 回复  |  直到 12 年前
        1
  •  15
  •   davidtingsu    12 年前

    使用A custom template filter!

    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'
    
        2
  •  8
  •   mpen    15 年前

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

        3
  •  7
  •   Alexandre    12 年前

    回答有点晚,但我实现了类似于在Django的管理员中所做的事情。

    首先,我添加了一个新属性 is_checkbox 到Field类:

    # 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 %}