Django: Как проверить, установлен ли виджет поля в шаблоне? - PullRequest
8 голосов
/ 13 октября 2010

Я создал пользовательский шаблон для отображения полей формы:

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

15 голосов
/ 12 января 2013

Используйте пользовательский шаблонный фильтр!

В 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'
8 голосов
/ 14 октября 2010

{{ field.field.widget.input_type }} даст вам эту информацию для многих виджетов, но не для всех. Я не уверен, будет ли это работать для виджета флажка по умолчанию или нет. Стоит выстрел.

7 голосов
/ 29 января 2013

Уже поздно отвечать, но я реализовал нечто похожее на то, что делается в админке Джанго.

Сначала я добавил новый атрибут 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 %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...