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
This commit is contained in:
Joseph Kocherhans 2010-02-02 00:41:28 +00:00
parent a0bae6ebb8
commit fbb42c31df
2 changed files with 17 additions and 9 deletions

View File

@ -1,16 +1,13 @@
import datetime import datetime
import decimal import decimal
import os
import re import re
import time import time
import django.utils.copycompat as copy import django.utils.copycompat as copy
from django.db import connection from django.db import connection
from django.db.models import signals
from django.db.models.fields.subclassing import LegacyConnection from django.db.models.fields.subclassing import LegacyConnection
from django.db.models.query_utils import QueryWrapper from django.db.models.query_utils import QueryWrapper
from django.dispatch import dispatcher
from django.conf import settings from django.conf import settings
from django import forms from django import forms
from django.core import exceptions, validators 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.functional import curry
from django.utils.itercompat import tee from django.utils.itercompat import tee
from django.utils.text import capfirst 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.encoding import smart_unicode, force_unicode, smart_str
from django.utils import datetime_safe from django.utils import datetime_safe
@ -198,7 +195,14 @@ class Field(object):
# Skip validation for non-editable fields. # Skip validation for non-editable fields.
return return
if self._choices and value: 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) raise exceptions.ValidationError(self.error_messages['invalid_choice'] % value)
if value is None and not self.null: if value is None and not self.null:

View File

@ -173,6 +173,10 @@ class ValidationTest(django.test.TestCase):
f = models.CharField(choices=[('a','A'), ('b','B')]) f = models.CharField(choices=[('a','A'), ('b','B')])
self.assertRaises(ValidationError, f.clean, "not a", None) 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): def test_nullable_integerfield_raises_error_with_blank_false(self):
f = models.IntegerField(null=True, blank=False) f = models.IntegerField(null=True, blank=False)
self.assertRaises(ValidationError, f.clean, None, None) self.assertRaises(ValidationError, f.clean, None, None)