Django добавляет тот же атрибут класса ко всем полям одинакового типа

74
6

Есть ли какой-либо простой способ присвоить class=radio всем элементам, чей виджет является радиоселектом в форме?
Я знаю, что могу написать такое, что


rb = forms.ChoiceField( widget=forms.RadioSelect(attrs='class':'radio'))

для всех переключателей в форме, но я думаю, что должны быть другие способы. Потому что я, вероятно, использую его для всех переключателей, и смешно писать это для всех.

спросил(а) 2021-01-14T14:11:13+03:00 1 месяц, 1 неделя назад
1
Решение
74

Вы можете создать свой собственный виджет, например:

class MyRadioSelect(forms.RadioSelect):

def __init__(self, *args, **kwargs):
attrs = kwargs.pop("attrs", {})
if "class" in attrs:
attrs["class"] = "%s radio" % attrs["class"]
else:
attrs["class"] = "radio"
kwargs["attrs"] = attrs
super(MyRadioSelect, self).__init__(*args, **kwargs)

ответил(а) 2021-01-14T14:11:13+03:00 1 месяц, 1 неделя назад
60

как это?

class ClassyRadioSelect(forms.RadioSelect):
def __init__(self, *args, **kwargs):
#yes, i've to look up how to process args and kwargs properly
attrs = kwargs.get('attrs', {})
attrs['class'] = ' '.join((attrs.get('class',''), 'radio'))
kwargs['attrs'] = attrs
super(ClassyRadioSelect, self).__init__(*args, **kwargs)

class ClassyChoiceField(forms.ChoiceField):
def __init__(self, choices=(), required=True, widget=None, label=None,
initial=None, help_text=None, *args, **kwargs):
if not widget:
widget = ClassyRadioSelect()
super(ClassyChoiceField, self).__init__(choices, required, widget, label
, initial, help_text, *args,
**kwargs)

class MyForm(forms.Form):
classy_field1 = ClassyChoiceField()
classy_field2 = ClassyChoiceField()

ответил(а) 2021-01-14T14:11:13+03:00 1 месяц, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема