我正在编写一个自定义表单小部件,它覆盖以下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
在同一个类上覆盖该方法,但是我不清楚,即使从阅读源代码来看,我如何能够在没有 Select 小部件的情况下基于任意 HTML 属性返回选定的值。