У меня была похожая проблема, когда мне нужно было динамически добавить пользовательский атрибут для каждой опции.Но в Django 2.0 рендеринг html был перемещен в базовый класс Widget, поэтому изменение render_option
больше не работает.Вот решение, которое сработало для меня:
from django import forms
class CustomSelect(forms.Select):
def __init__(self, *args, **kwargs):
self.src = kwargs.pop('src', {})
super().__init__(*args, **kwargs)
def create_option(self, name, value, label, selected, index, subindex=None, attrs=None):
options = super(CustomSelect, self).create_option(name, value, label, selected, index, subindex=None, attrs=None)
for k, v in self.src.items():
options['attrs'][k] = v[options['value']]
return options
class CustomForm(forms.Form):
def __init__(self, *args, **kwargs):
src = kwargs.pop('src', {})
choices = kwargs.pop('choices', ())
super().__init__(*args, **kwargs)
if choices:
self.fields['custom_field'].widget = CustomSelect(attrs={'class': 'some-class'}, src=src, choices=choices)
custom_field = forms.CharField(max_length=100)
Затем в представлениях визуализируйте контекст с {'form': CustomForm(choices=choices, src=src)}
, где src
- словарь, подобный этому: {'attr-name': {'option_value': 'attr_value'}}
.