Djangoのformエラーのinput要素にclassを付与する

djangoで入力エラーのとき、input項目にclass="error"のようにして、デザインを変えたい場合。
フォームで動的にセットするにはどうすればいいか、調べてやってみました。

from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=10)
    email = forms.EmailField(widget=forms.TextInput(attrs={'class': 'mail'}))

    def __init__(self, *args, **kwargs):
        super(ContactForm, self).__init__(*args, **kwargs)
        if self.errors:
            for f_name in self.fields:
                if f_name in self.errors:
                    classes = self.fields[f_name].widget.attrs.get('class', '').split()
                    classes.append('error')
                    self.fields[f_name].widget.attrs['class'] = ' '.join(classes)

エラーでないとき

>>> form = ContactForm({'name': 'brainstorm', 'email': 'brainstorm@example.com'})
>>> form.is_valid()
True
>>> form["name"].as_widget()
u'<input id="id_name" maxlength="10" name="name" type="text" value="brainstorm" />'
>>> form["email"].as_widget()
u'<input class="primary" id="id_email" name="email" type="text" value="brainstorm@example.com" />


エラーのとき

>>> form = ContactForm({'name': 'aaaaaaaaaaaaaaaaaaaaaaaaaaa', 'email': 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'})
>>> form.is_valid()
False
>>> form["name"].as_widget()
u'<input class="error" id="id_name" maxlength="10" name="name" type="text" value="aaaaaaaaaaaaaaaaaaaaaaaaaaa" />'
>>> form["email"].as_widget()
u'<input class="primary error" id="id_email" name="email" type="text" value="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" />'