Как изменить приложение-виджет Django NullBooleanField в ширину? - PullRequest
1 голос
/ 23 августа 2010

Я бы хотел отобразить все NullBooleanFields в моем приложении в виде переключателей. Какой лучший способ сделать это?

Следующий шаблон или что-то подобное было бы идеально. Просто для того, чтобы богатый стиль и тон голоса отличались от простого «Да / Нет / Неизвестно».

'''<li class="field-%s">
    <label class="%s" title="%s">%s</label>
    <label class="y"><input type="radio" name="%s" value="1" %s /> %s</label>
    <label class="n"><input type="radio" name="%s" value="0" %s /> %s</label>
    <label class="e"><input type="radio" name="%s" value=""  %s /> %s</label>
    </li>
''' % (
        field,
        field, help text, verbose_name,
        field, y, y_label,
        field, n, n_label,
        field, e, e_label
    )

Ответы [ 2 ]

2 голосов
/ 02 сентября 2010

В конце я понял, что установка виджетов на RadioSelect один за другим - это меньше кода, хотя у меня много NullBooleanFields. Структура <ul>, создаваемая виджетом RadioSelect, имеет достаточную структуру для стиля, даже если для этого требуются селекторы CSS3.

Не СУХОЙ, но меньше хлопот. Нужно быть прагматичным и двигаться дальше.

Если бы кто-то мог предоставить код для изменения виджета по умолчанию для NullBooleanField с NullBooleanSelect до RadioSelect на уровне forms.py, я бы с радостью принял ответ.

1 голос
/ 05 мая 2014

Я только что реализовал собственный виджет для этого:

class YesNoNARadioSelect(widgets.Widget):
    CHOICES=((True,'Yes'),(False,'No'),(None,'N/A'))

    def render(self,name,value,attrs=None):
        s=[]
        for c in self.CHOICES:
            extraAttrs=attrs.copy()
            extraAttrs.update(dict(type='radio',name=name,value=c[0]))
            if value==c[0]: extraAttrs['checked']='checked'
            extraAttrs=self.build_attrs(extraAttrs)
            s.append(format_html('<label><input {}/>{}</label>',flatatt(extraAttrs),c[1]))
        return S(''.join(s))

Кажется, работает для меня, хотя я хотел бы услышать обо всем, что я делаю с этим не так.

...