Я написал собственный виджет
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})
При отправке формы значение AutoComplete возвращается в виде списка разделенных запятыми выбранных идентификаторов, например. 12,45,43,66, что если то, что я хочу.
Однако, если в форме есть ошибка, например, обязательное поле не было введено, значение поля автозаполнения теперь составляет 12,45,43,66, а не требуемой строки json.
Как лучше всего это решить. Я думал о перезаписи метода clean в классе формы, но я не уверен, как узнать, возвратил ли какой-либо другой элемент ошибку. например, * 1 016 *
if forms.errors
form.cleaned_date['autocomplete'] = json string
return form.cleaned_data
Спасибо