Files
2024-11-27 13:18:16 +01:00

30 lines
959 B
Python
Executable File

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)