Source code for extended_choices.fields

"""Provides a form field for django to use constants instead of values as available values.

Notes
-----

The documentation format in this file is `numpydoc`_.

.. _numpydoc: https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt

"""

from __future__ import unicode_literals

from past.builtins import basestring

from django import forms

from . import Choices


[docs]class NamedExtendedChoiceFormField(forms.Field): """Field to use with choices where values are constant names instead of choice values. Should not be very useful in normal HTML form, but if API validation is done via a form, it will to have more readable constants in the API that values """ def __init__(self, choices, *args, **kwargs): """Override to ensure that the ``choices`` argument is a ``Choices`` object.""" super(NamedExtendedChoiceFormField, self).__init__(*args, **kwargs) if not isinstance(choices, Choices): raise ValueError("`choices` must be an instance of `extended_choices.Choices`.") self.choices = choices
[docs] def to_python(self, value): """Convert the constant to the real choice value.""" # ``is_required`` is already checked in ``validate``. if value is None: return None # Validate the type. if not isinstance(value, basestring): raise forms.ValidationError( "Invalid value type (should be a string).", code='invalid-choice-type', ) # Get the constant from the choices object, raising if it doesn't exist. try: final = getattr(self.choices, value) except AttributeError: available = '[%s]' % ', '.join(self.choices.constants) raise forms.ValidationError( "Invalid value (not in available choices. Available ones are: %s" % available, code='non-existing-choice', ) return final