from django import forms from django.core.exceptions import ValidationError class EnumChoiceField(forms.ChoiceField): def __init__(self, enum, **kwargs): kwargs.setdefault("choices", [(item, item.value) for item in enum]) super().__init__(**kwargs) self.enum = enum def prepare_value(self, value): if isinstance(value, self.enum): return str(value) return value def to_python(self, value): value = super().to_python(value) if not isinstance(value, self.enum): try: enum_name, enum_value = value.split(".", 1) if enum_name == self.enum.__name__: value = self.enum[enum_value] except ValueError: raise ValidationError(self.error_messages["invalid"], code="invalid") return value def clean(self, value): value = super().clean(value) return self.enum(value)