Skip to content

Commit 0a4d786

Browse files
authored
Merge pull request #70 from lucaswiman/allow-passing-enum-objects-as-data
Allow passing enum objects as data to form
2 parents 9c65553 + cc437b8 commit 0a4d786

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

enumfields/forms.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
# -- encoding: UTF-8 --
2+
from __future__ import absolute_import
3+
24
from django.forms import TypedChoiceField
35
from django.forms.fields import TypedMultipleChoiceField
46
from django.utils.encoding import force_text
57

8+
from .enums import Enum
9+
610
__all__ = ["EnumChoiceField", "EnumMultipleChoiceField"]
711

812

@@ -22,6 +26,11 @@ def valid_value(self, value):
2226
return True
2327
return super(EnumChoiceFieldMixin, self).valid_value(value)
2428

29+
def to_python(self, value):
30+
if isinstance(value, Enum):
31+
value = value.value
32+
return super(EnumChoiceFieldMixin, self).to_python(value)
33+
2534

2635
class EnumChoiceField(EnumChoiceFieldMixin, TypedChoiceField):
2736
pass

tests/test_form_fields.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
import pytest
33
import six
44
from django.db.models import BLANK_CHOICE_DASH
5-
from django.forms.models import modelform_factory
5+
from django.forms.models import modelform_factory, model_to_dict
66

7-
from .enums import Color
7+
from .enums import Color, ZeroEnum
88
from .models import MyModel
99

1010

@@ -30,3 +30,13 @@ def test_choices():
3030
form = get_form()
3131
assert form.base_fields["zero2"].choices == [(0, 'Zero'), (1, 'One')]
3232
assert form.base_fields["int_enum"].choices == BLANK_CHOICE_DASH + [(0, 'foo'), (1, 'B')]
33+
34+
35+
def test_validation():
36+
form = get_form(data={"color": Color.GREEN, "zero2": ZeroEnum.ZERO})
37+
assert form.is_valid(), form.errors
38+
39+
instance = MyModel(color=Color.RED, zero2=ZeroEnum.ZERO)
40+
data = model_to_dict(instance, fields=("color", "zero2", "int_enum"))
41+
form = get_form(data=data)
42+
assert form.is_valid(), form.errors

0 commit comments

Comments
 (0)