views:

251

answers:

1

Hi I have wrote a custom widget

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)

this widget uses a jquery function which autocompletes a word based on entries from the database. You can preset its initial values by setting prePopulate to a json string in the form

['name': 'some name', 'id': 'some id']

I do this by setting the inital value of the form field to this json string

jquery_string = ['name': 'some name', 'id': 'some id']
form = MyForm(initial={'AutoComplete':jquery_string})

When submitting the form the the value of AutoComplete is returned as a comma seperated list of the selected ids e.g. 12,45,43,66 which if what I want.

However if there is an error in the form, for example a required field has not been entered the value of the AutoComplete field is now 12,45,43,66 and not the json string which it requires.

What is the best way to solve this. I was thinking about overwriting the clean method in the form class but I'm not sure how to find out if any other element has returned an error. e.g.

if forms.errors
   form.cleaned_date['autocomplete'] = json string

return form.cleaned_data

Thanks

A: 

So why you can't do clean in the appropriate field clean method?

I also use the same technique for generating autocomplete field using custom widget. When user selects some result from the widget, my js code populate hidden "id" field with the correct id, and then I have this field clean method:

 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
dragoon