forms.py 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from crispy_forms.helper import FormHelper
  2. from django.utils.translation import ugettext_lazy as _
  3. from django.forms import * # noqa
  4. from django.forms import Form as BaseForm, ModelForm as BaseModelForm
  5. TEXT_BASED_FIELDS = (
  6. CharField, EmailField, FilePathField, URLField
  7. )
  8. class YesNoSwitchBase(TypedChoiceField):
  9. def prepare_value(self, value):
  10. """normalize bools to binary 1/0 so field works on them too"""
  11. return 1 if value else 0
  12. def clean(self, value):
  13. value = 1 if value else 0
  14. return super(YesNoSwitchBase, self).clean(value)
  15. def YesNoSwitch(**kwargs):
  16. if 'initial' not in kwargs:
  17. kwargs['initial'] = 0
  18. kwargs['initial'] = 1 if kwargs['initial'] else 0
  19. return YesNoSwitchBase(
  20. coerce=int,
  21. choices=((1, _("Yes")), (0, _("No"))),
  22. widget=RadioSelect(attrs={'class': 'yesno-switch'}),
  23. **kwargs)
  24. class AutoStripWhitespacesMixin(object):
  25. autostrip_exclude = []
  26. def full_clean(self):
  27. self.data = self.data.copy()
  28. for name, field in self.fields.iteritems():
  29. if (field.__class__ in TEXT_BASED_FIELDS and
  30. not name in self.autostrip_exclude):
  31. try:
  32. self.data[name] = self.data[name].strip()
  33. except KeyError:
  34. pass
  35. return super(AutoStripWhitespacesMixin, self).full_clean()
  36. class Form(AutoStripWhitespacesMixin, BaseForm):
  37. pass
  38. class ModelForm(AutoStripWhitespacesMixin, BaseModelForm):
  39. pass