/floppyforms/fields.py

https://github.com/ouhouhsami/django-floppyforms · Python · 158 lines · 98 code · 59 blank · 1 comment · 9 complexity · 38ff13ba7498031aca1cda5fc1a51bfe MD5 · raw file

  1. from django import forms
  2. from .widgets import (TextInput, HiddenInput, CheckboxInput, Select,
  3. ClearableFileInput, SelectMultiple, DateInput,
  4. DateTimeInput, TimeInput, URLInput, NumberInput,
  5. EmailInput, NullBooleanSelect, SlugInput, IPAddressInput,
  6. SplitDateTimeWidget, SplitHiddenDateTimeWidget)
  7. __all__ = (
  8. 'Field', 'CharField', 'IntegerField', 'DateField', 'TimeField',
  9. 'DateTimeField', 'EmailField', 'FileField', 'ImageField', 'URLField',
  10. 'BooleanField', 'NullBooleanField', 'ChoiceField', 'MultipleChoiceField',
  11. 'FloatField', 'DecimalField', 'SlugField', 'RegexField', 'IPAddressField',
  12. 'GenericIPAddressField', 'TypedChoiceField', 'FilePathField',
  13. 'TypedMultipleChoiceField', 'ComboField', 'MultiValueField',
  14. 'SplitDateTimeField',
  15. )
  16. class Field(forms.Field):
  17. widget = TextInput
  18. hidden_widget = HiddenInput
  19. class CharField(Field, forms.CharField):
  20. widget = TextInput
  21. def widget_attrs(self, widget):
  22. attrs = super(CharField, self).widget_attrs(widget)
  23. if attrs is None:
  24. attrs = {}
  25. if self.max_length is not None and isinstance(widget, (TextInput, HiddenInput)):
  26. # The HTML attribute is maxlength, not max_length.
  27. attrs.update({'maxlength': str(self.max_length)})
  28. return attrs
  29. class BooleanField(Field, forms.BooleanField):
  30. widget = CheckboxInput
  31. class NullBooleanField(Field, forms.NullBooleanField):
  32. widget = NullBooleanSelect
  33. class ChoiceField(Field, forms.ChoiceField):
  34. widget = Select
  35. class TypedChoiceField(ChoiceField, forms.TypedChoiceField):
  36. widget = Select
  37. class FilePathField(ChoiceField, forms.FilePathField):
  38. widget = Select
  39. class FileField(Field, forms.FileField):
  40. widget = ClearableFileInput
  41. class ImageField(Field, forms.ImageField):
  42. widget = ClearableFileInput
  43. class MultipleChoiceField(Field, forms.MultipleChoiceField):
  44. widget = SelectMultiple
  45. class TypedMultipleChoiceField(MultipleChoiceField,
  46. forms.TypedMultipleChoiceField):
  47. pass
  48. class DateField(Field, forms.DateField):
  49. widget = DateInput
  50. class DateTimeField(Field, forms.DateTimeField):
  51. widget = DateTimeInput
  52. class TimeField(Field, forms.TimeField):
  53. widget = TimeInput
  54. class DecimalField(Field, forms.DecimalField):
  55. widget = NumberInput
  56. class FloatField(Field, forms.FloatField):
  57. widget = NumberInput
  58. class IntegerField(Field, forms.IntegerField):
  59. widget = NumberInput
  60. def widget_attrs(self, widget):
  61. attrs = super(IntegerField, self).widget_attrs(widget) or {}
  62. if self.min_value is not None:
  63. attrs['min'] = self.min_value
  64. if self.max_value is not None:
  65. attrs['max'] = self.max_value
  66. return attrs
  67. class EmailField(Field, forms.EmailField):
  68. widget = EmailInput
  69. class URLField(Field, forms.URLField):
  70. widget = URLInput
  71. class SlugField(Field, forms.SlugField):
  72. widget = SlugInput
  73. class RegexField(Field, forms.RegexField):
  74. widget = TextInput
  75. def __init__(self, regex, js_regex=None, max_length=None, min_length=None,
  76. error_message=None, *args, **kwargs):
  77. self.js_regex = js_regex
  78. super(RegexField, self).__init__(regex, max_length, min_length,
  79. *args, **kwargs)
  80. def widget_attrs(self, widget):
  81. attrs = super(RegexField, self).widget_attrs(widget) or {}
  82. if self.js_regex is not None:
  83. attrs['pattern'] = self.js_regex
  84. return attrs
  85. class IPAddressField(Field, forms.IPAddressField):
  86. widget = IPAddressInput
  87. class GenericIPAddressField(Field, forms.GenericIPAddressField):
  88. pass
  89. class ComboField(Field, forms.ComboField):
  90. pass
  91. class MultiValueField(Field, forms.MultiValueField):
  92. pass
  93. class SplitDateTimeField(forms.SplitDateTimeField):
  94. widget = SplitDateTimeWidget
  95. hidden_widget = SplitHiddenDateTimeWidget
  96. def __init__(self, *args, **kwargs):
  97. super(SplitDateTimeField, self).__init__(*args, **kwargs)
  98. for widget in self.widget.widgets:
  99. widget.is_required = self.required