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 属性に基づいて選択された値を返す方法は明らかではありません。