カスタムウィジェットを作成しました
class AutoCompleteWidget(widgets.TextInput):
"""
widget to show an autocomplete box which returns a list on nodes available to be tagged
"""
def render(self, name, value, attrs=None):
final_attrs = self.build_attrs(attrs, name=name)
if not self.attrs.has_key('id'):
final_attrs['id'] = 'id_%s' % name
if not value: value = '[]'
jquery = u"""
<script type="text/javascript">
$("#%s").tokenInput('%s', {
hintText: "Enter the word",
noResultsText: "No results",
prePopulate: %s,
searchingText: "Searching..."
});
$("body").focus();
</script>
""" % (final_attrs['id'], reverse('ajax_autocomplete'), value)
output = super(AutoTagWidget, self).render(name, "", attrs)
return output + mark_safe(jquery)
class MyForm(forms.Form):
AutoComplete = forms.CharField(widget=AutoCompleteWidget)
このウィジェットは、データベースのエントリに基づいて単語をオートコンプリートするjquery関数を使用します。prePopulateをフォームのjson文字列に設定することで、初期値を事前設定できます
['name': 'some name', 'id': 'some id']
これを行うには、フォームフィールドの初期値をこのjson文字列に設定します
jquery_string = ['name': 'some name', 'id': 'some id']
form = MyForm(initial={'AutoComplete':jquery_string})
フォームを送信すると、オートコンプリートの値が、選択したIDのコンマ区切りのリストとして返されます(例:12,45,43,66)。
ただし、フォームにエラーがある場合、たとえば、必須フィールドが入力されていない場合、オートコンプリートフィールドの値は12,45,43,66になり、必要なjson文字列ではなくなります。
これを解決するための最良の方法は何ですか。フォームクラスのcleanメソッドを上書きすることを考えていましたが、他の要素がエラーを返したかどうかを確認する方法がわかりません。例えば
if forms.errors
form.cleaned_date['autocomplete'] = json string
return form.cleaned_data
ありがとう