Перезаписать метод очистки в пользовательских формах Django - PullRequest
1 голос
/ 03 марта 2010

Я написал собственный виджет

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

Спасибо

1 Ответ

0 голосов
/ 22 марта 2010

Так почему вы не можете сделать очистку в соответствующем методе очистки поля?

Я также использую ту же технику для генерации поля автозаполнения с помощью пользовательского виджета. Когда пользователь выбирает какой-либо результат из виджета, мой js-код заполняет скрытое поле «id» правильным идентификатором, и тогда у меня есть этот метод очистки поля:

 def clean_category(self):
        try:
            category = Category.objects.get(id=int(self.cleaned_data['category']))
        except:
            raise forms.ValidationError("Such category doesn't exist")
        return category
...