Skip to main content

This package lets you use real Python (PEP435-style) enums with Django.

https://travis-ci.org/druids/django-choice-enumfields.svg?branch=master

Installation

  1. pip install skip-django-choice-enumfields

Included Tools

EnumField, NumEnumField

from enumfields import EnumField
from enumfields import ChoiceEnum  # Uses Ethan Furman's "enum34" backport

class Color(ChoiceEnum):
    RED = 'r'
    GREEN = 'g'
    BLUE = 'b'

class MyModel(models.Model):

    color = EnumField(Color, max_length=1)

Elsewhere:

m = MyModel.objects.filter(color=Color.RED)

NumEnumField works identically, but the underlying storage mechanism is an IntegerField instead of a CharField.

EnumSubField, NumEnumSubField

from enumfields import EnumField, EnumSubField
from enumfields import ChoiceEnum

class Color(ChoiceEnum):
    RED = 'r'
    GREEN = 'g'
    BLUE = 'b'

class ColorType(ChoiceEnum):
    LIGHT = Choice('l', 'light', parents=(Color.RED, Color.BLUE))
    DARK = Choice('d', 'dark', parents=(Color.RED, Color.GREEN))
    TRANSPARENT = Choice('t', 'transparent', parents=(Color.GREEN))

class MyModel(models.Model):

    color = EnumField(Color, max_length=1)
    color_type = EnumSubField('color', ColorType, max_length=1)

MyModel(color=Color.RED, color_type=ColorType.LIGHT).full_clean()  # OK
MyModel(color=Color.RED, color_type=ColorType.TRANSPARENT).full_clean()  # Raise ValidationError

EnumSubField automatically validates if parents requirement is satisfied.

With EnumSubField, EnumField, NumEnumSubField and NumEnumField comes validation of initial and allowed transitions between choices out of the box.

from enumfields import EnumField
from enumfields import Choice, ChoiceEnum

class StateFlow(ChoiceEnum):
    START = Choice('s', 'start', next={'PROCESSING'})
    PROCESSING = Choice('p', 'processing', next={'END'}, initial=False)
    END = Choice('e', 'end', next=set(), initial=False)

class MyModel(models.Model):

    state = EnumField(StateFlow, max_length=1)

MyModel(state=StateFlow.START).full_clean()  # OK

# Raise ValidationError because PROCESSING is not in initial states
MyModel(state=StateFlow.PROCESSING).full_clean()

model = MyModel.objects.create(StateFlow.START)
model.state = StateFlow.END
# Raise ValidationError because END is not next state after START
model.full_clean()

model.state = StateFlow.PROCESSING
model.full_clean()  # OK

Usage in Forms

Call the formfield method to use an EnumField directly in a Form.

class MyForm(forms.Form):

    color = EnumField(Color, max_length=1).formfield()

ChoiceEnum

Normally, you just use normal PEP435-style enums, however, django-choice-enumfields also encludes its own version of ChoiceEnum with a few extra bells and whistles. Namely, the smart definition of labels which are used, for example, in admin dropdowns. By default, it will create labels by title-casing your constant names. You can provide custom labels with using Choice to define enum item.

from enumfields import EnumField, ChoiceEnum, Choice  # Our own Enum class

class Color(ChoiceEnum):
    RED = Choice('r', 'A custom label')
    GREEN = 'g'
    BLUE = 'b'

class MyModel(models.Model):
    color = EnumField(Color, max_length=1)

assert Color.GREEN.label == 'Green'
assert Color.RED.label == 'A custom label'

EnumFieldListFilter

enumfields.admin.EnumFieldListFilter is provided to allow using enums in list_filter.

from enumfields.admin import EnumFieldListFilter

class MyModelAdmin(admin.ModelAdmin):
  list_filter = [('color', EnumFieldListFilter)]

Metadata

Release files for skip-django-choice-enumfields 2.0.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for skip-django-choice-enumfields 2.0.1
File Size Uploaded
skip_django_choice_enumfields-2.0.1.tar.gz 15.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for skip-django-choice-enumfields 2.0.1
File Interpreter ABI Platform
skip_django_choice_enumfields-2.0.1-py2.py3-none-any.whl Python 2, Python 3 none any Details

Total release size: 27.2 kB

Release files / skip_django_choice_enumfields-2.0.1.tar.gz

Download URL skip_django_choice_enumfields-2.0.1.tar.gz
Size 15.7 kB
Tags Source
SHA-256 checksum
How to use checksums
e58f9d454f1f85b69b0af982ee45b0c053dc9eaae4b3a51141af4d7cc015b5c0
BLAKE2b-256 checksum
How to use checksums
d8697e20099a3994dd706a68020c38cf8842c4ce15206c60b4f489d39417922e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / skip_django_choice_enumfields-2.0.1-py2.py3-none-any.whl

Download URL skip_django_choice_enumfields-2.0.1-py2.py3-none-any.whl
Size 11.5 kB
Tags Python 2 Python 3
SHA-256 checksum
How to use checksums
26a9a34a970b9f754b01e25327505275623a8905e9b23884100cbb5ea7b0ceb0
BLAKE2b-256 checksum
How to use checksums
62ae42bf6b9ebe48fb5247111524e4f0ab0371e5e0b117efe14b8969a0198e66
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

2.0.1 This release

2 release files

2.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page