Commit fbb42c31 authored by Joseph Kocherhans's avatar Joseph Kocherhans
Browse files

Fixed #12667. Added optgroup validation support to model fields with choices. Thanks ramiro.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12374 bcc190cf-cafb-0310-a4f2-bffc1f526a37
parent a0bae6eb
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
import datetime
import decimal
import os
import re
import time

import django.utils.copycompat as copy

from django.db import connection
from django.db.models import signals
from django.db.models.fields.subclassing import LegacyConnection
from django.db.models.query_utils import QueryWrapper
from django.dispatch import dispatcher
from django.conf import settings
from django import forms
from django.core import exceptions, validators
@@ -18,7 +15,7 @@ from django.utils.datastructures import DictWrapper
from django.utils.functional import curry
from django.utils.itercompat import tee
from django.utils.text import capfirst
from django.utils.translation import ugettext_lazy as _, ugettext
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import smart_unicode, force_unicode, smart_str
from django.utils import datetime_safe

@@ -198,7 +195,14 @@ class Field(object):
            # Skip validation for non-editable fields.
            return
        if self._choices and value:
            if not value in dict(self.choices):
            for option_key, option_value in self.choices:
                if type(option_value) in (tuple, list):
                    # This is an optgroup, so look inside the group for options.
                    for optgroup_key, optgroup_value in option_value:
                        if value == optgroup_key:
                            return
                elif value == option_key:
                    return
            raise exceptions.ValidationError(self.error_messages['invalid_choice'] % value)

        if value is None and not self.null:
+7 −3
Original line number Diff line number Diff line
@@ -173,6 +173,10 @@ class ValidationTest(django.test.TestCase):
        f = models.CharField(choices=[('a','A'), ('b','B')])
        self.assertRaises(ValidationError, f.clean, "not a", None)

    def test_choices_validation_supports_named_groups(self):
        f = models.IntegerField(choices=(('group',((10,'A'),(20,'B'))),(30,'C')))
        self.assertEqual(10, f.clean(10, None))

    def test_nullable_integerfield_raises_error_with_blank_false(self):
        f = models.IntegerField(null=True, blank=False)
        self.assertRaises(ValidationError, f.clean, None, None)