Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Django model choice not raising error for an invalid choice

Tags:

python

django

I have an object in Django with a choice field

class CustomFieldType(models.Model):
    STRING = 'STRING'
    DATE = 'DATE'
    BOOLEAN = 'BOOLEAN'
    NUMERIC = 'NUMERIC'
    EMAIL = 'EMAIL'
    TYPE_CHOICES = (
        (STRING, _('String')),
        (DATE, _('Date')),
        (BOOLEAN, _('Boolean')),
        (NUMERIC, _('Numeric')),
        (EMAIL, _('Email'))
    )
    name = models.CharField(max_length=256)
    field_type = models.CharField(choices=TYPE_CHOICES, default=STRING, max_length=10)
    company = models.ForeignKey('Company')

    class Meta:
        unique_together = ('name', 'company')

    def __unicode__(self):
        return self.name

In my django console

$> CustomFieldType.objects.create(name='custom_name',field_type='noError',company=mycompany)
<CustomFieldType: custom_name>
$> CustomFieldType.objects.get(name='custom_name').field_type
u'noError'

Why django is not raising an error (ValidationError) ? Or Am I missing something ?

like image 770
Guillaume Vincent Avatar asked Dec 12 '13 12:12

Guillaume Vincent


Video Answer


2 Answers

The choices option is only for pre-populating of form drop down fields; it does not enforce any validation:

If this is given, the default form widget will be a select box with these choices instead of the standard text field.

like image 50
Burhan Khalid Avatar answered Nov 15 '22 22:11

Burhan Khalid


UPDATE

Since django 2.1, setting choices does raise validation errors:

If choices are given, they’re enforced by model validation and the default form widget will be a select box with these choices instead of the standard text field.

Note that, CustomFieldType.objects.create is not enough. You need to do something like a model_instance.full_clean() to raise the error. Just as mentioned in the model validation docs

like image 32
Vedant Agarwala Avatar answered Nov 15 '22 22:11

Vedant Agarwala