【发布时间】:2013-11-08 19:12:56
【问题描述】:
我正在编写一个覆盖choice method in 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 method on 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)
(我按照this blog post上的例子)
我需要创建一个完全自定义的小部件,它可以根据 HTML 元素上的 data-selected 属性值来选择对象。我已经能够使用上面添加的实例属性在表单上显示自定义 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 返回选定的值没有选择小部件的属性。
【问题讨论】:
标签: django django-forms django-widget