30 lines
959 B
Python
Executable File
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)
|