django radioselect рендерит в таблицу - PullRequest
2 голосов
/ 16 февраля 2011

Я хочу отобразить радиоселект виджета формы django в таблицу, а не в список ul. С метками в первом ряду и переключателями внизу во втором ряду. Одна ячейка для каждой кнопки. например,

-------------------------------
| label 1 | label 2 | label 3 |
-------------------------------
|   O     |    O    |    O    |
-------------------------------

Я посмотрел на виджет selectradio по умолчанию, но функция рендеринга кажется такой сложной, вызывая множество различных классов для выполнения каждой части рендеринга.

У кого-нибудь есть примеры, как это сделать, или можно найти простое решение?

Ответы [ 4 ]

7 голосов
/ 24 июля 2011

Просто, чтобы заполнить еще немного ответа Береса Ботона

class MyForm(forms.ModelForm):
    my_field = forms.TypedChoiceField(choices=some_choices,
                                      label=u"bla",
                                      widget=forms.RadioSelect(renderer=MyCustomRenderer))

Пользовательский рендер будет выглядеть так:

from django import forms
from django.forms.widgets import RadioFieldRenderer
from django.utils.encoding import force_unicode
from django.utils.safestring import mark_safe

class MyCustomRenderer( RadioFieldRenderer ):
    def render( self ):
        """Outputs a series of <td></td> fields for this set of radio fields."""
        return( mark_safe( u''.join( [ u'<td>%s</td>' % force_unicode(w.tag()) for w in self ] )))

В этом случае я не хотел, чтобы рядом с ним находилось имя радиоблока, поэтому я использую «force_unicode (w.tag ())». Если вы хотите, чтобы имя рядом с ним, просто визуализируйте объект прямо как "force_unicode (ш)"

Надеюсь, это поможет!

2 голосов
/ 16 февраля 2011

Вам необходимо создать подкласс django.forms.widgets.RadioFieldRenderer и переопределить его рендеринг метода.Затем в своей форме при объявлении поля укажите пользовательский рендерер для виджета

class MyForm(forms.ModelForm):
    my_field = forms.TypedChoiceField(choices=some_choices,
                                      label=u"bla",
                                      widget=forms.RadioSelect(renderer=MyCustomRenderer))
0 голосов
/ 13 февраля 2017

Если вам нужно дополнительно настроить элементы ввода, перезапишите атрибут choice_input_class в пользовательском устройстве визуализации.

from django.forms.widgets import RadioChoiceInput, RadioFieldRenderer   
from django.utils.safestring import mark_safe
from django.utils.html import format_html

class MyCustomRenderer( RadioFieldRenderer ):
    choice_input_class = MyCustomInputClass

class MyCustomInputClass(RadioChoiceInput):
    def render(self, name=None, value=None, attrs=None, choices=()):
        # Generate outer label, insert a custom div
        output = format_html('''
            <div id="{}"></div>
        ''', self.choice_label)
        if self.id_for_label:
            label_for = format_html(' for="{}"', self.id_for_label)
        else:
            label_for = ''
        attrs = dict(self.attrs, **attrs) if attrs else self.attrs
        return format_html('<label{}>{} {}</label>',
                           label_for, self.tag(attrs), output)

    def tag(self, attrs=None):
        # Generate the customized input element.
        attrs = attrs or self.attrs
        final_attrs = dict(attrs, type=self.input_type, name=self.name, value=self.choice_value)
        if self.is_checked():
            final_attrs['checked'] = 'checked'
        return format_html('<input{} class="my_custom_class" />', flatatt(final_attrs))

Эти render() и tag() методы взяты из исходного кода 1.9, только слегка изменены, чтобы показать применение простой настройки в каждом.

0 голосов
/ 29 марта 2011

Вы также можете использовать django-uni-form и использовать div вместо таблиц.

...