それで、jQueryにこれからの単純なテキスト入力を変換させたとしましょう
<input class='employee_list' name='requestor' type='text' />
これに
<div name='requestor' class='ajax_picker'>
<input class='search_box' class='employee_list' name='requestor_text' type='text'/>
<input class='id' name='requestor' type='hidden' value='' />
<div class='results'></div>
</div>
そして、AJAX+JSONを使用して非表示の入力値をロードします。問題は、if form.is_valid() is not True
では、両方の値をレンダリングするカスタムウィジェットを作成するにはどうすればよいですか?私は2つの異なる分野を行うことができると思っていますが、それは醜いようです。フォームのレンダリングをカスタマイズすることもできますが、それはさらに悪いことです。フォームはすべてのPOSTデータをウィジェットに渡すことができますが、それを機能させる方法を理解できないようです。
これを達成するためのエレガントな方法が必要です!
from django import forms
class AjaxPickerWidget(forms.TextInput):
def render(self, name, value, attrs=None):
# ... now what?
return super(AjaxPickerWidget, self).render(name, value, attrs=attrs)
私の解決策
あなたの助けに感謝し、私は別のアプローチを取りました。これをモデルに厳密に使用しているため(したがって、キーと値のペアが必要です)、ウィジェットをモデルと直接対話させdata-id
、jQueryが非表示フィールドに移動するためにキャッチする属性を作成しました。
from django import forms
class AjaxPickerModelWidget(forms.TextInput):
def __init__(self, css_class, queryset, id_name, value_name, attrs={}):
attrs['class'] = css_class
self.queryset = queryset
self.id_name = id_name
self.value_name = value_name
super(AjaxPickerModelWidget, self).__init__(attrs=attrs)
def render(self, name, value, attrs={}):
try:
instance = self.queryset.get(**{self.id_name: value})
attrs['data-id'] = value
value = getattr(instance, self.value_name)
except:
value = ''
return super(AjaxPickerModelWidget, self).render(name, value,
attrs=attrs)