Я пишу собственный виджет формы, который переопределяет choice
метод в django.forms.models.ModelChoiceIterator
:
class CustomIterator(ModelChoiceIterator):
def choice(self, obj):
return (self.field.prepare_value(obj),
self.field.label_from_instance(obj), obj)
А также метод _get_choices
для django.forms.models.ModelChoiceField
< /а>:
class CustomField(ModelChoiceField):
def _get_choices(self):
if hasattr(self, '_choices'):
return self._choices
return ElfIterator(self)
choices = property(_get_choices, ChoiceField._set_choices)
(Я следовал примеру из этой записи в блоге)
Мне нужно создать полностью настраиваемый виджет, который выбирает объекты на основе, скажем, значения атрибута data-selected
в элементе HTML. Мне удалось отобразить пользовательский HTML/стиль в форме, используя атрибуты экземпляра, добавленные выше:
from django.template.loader import render_to_string
class CustomWidget(Widget):
def render(self, name, value, attrs=None):
obj_list = [item[2] for item in self.choices]
obj_dict = [model_to_dict(obj) for obj in obj_list]
output = render_to_string('myapp/widgets/custom_widget.html',
{ 'obj_dict': obj_dict })
return mark_safe(output)
Теперь я пытаюсь переопределить метод value_from_datadict
в этом же классе, однако мне не ясно, даже из чтения исходного кода, как я смогу вернуть выбранное значение на основе произвольного атрибута HTML без виджета Select .