diff options
| author | Franck Michea <franck.michea@gmail.com> | 2018-08-21 22:35:25 +0200 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2018-08-22 09:15:19 -0400 |
| commit | 7def8bed58757422dcc932e38e1b5caa3b0382c7 (patch) | |
| tree | edd8a1c9cdc22c72ed2a3b165c0c25df305271e9 | |
| parent | 50b8493581fea3d7137dd8db33bac7008868d23a (diff) | |
Fixed #29698 -- Fixed Field._check_choices() crash on invalid choices.
| -rw-r--r-- | django/db/models/fields/__init__.py | 2 | ||||
| -rw-r--r-- | tests/invalid_models_tests/test_ordinary_fields.py | 22 |
2 files changed, 15 insertions, 9 deletions
diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index dbadfc6c90..dbe0c1d5f6 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -260,7 +260,7 @@ class Field(RegisterLookupMixin): for choices_group in self.choices: try: group_name, group_choices = choices_group - except ValueError: + except (TypeError, ValueError): # Containing non-pairs break try: diff --git a/tests/invalid_models_tests/test_ordinary_fields.py b/tests/invalid_models_tests/test_ordinary_fields.py index 546c16a976..184041c24d 100644 --- a/tests/invalid_models_tests/test_ordinary_fields.py +++ b/tests/invalid_models_tests/test_ordinary_fields.py @@ -174,14 +174,20 @@ class CharFieldTests(TestCase): class Model(models.Model): field = models.CharField(max_length=10, choices=[(1, 2, 3), (1, 2, 3)]) - field = Model._meta.get_field('field') - self.assertEqual(field.check(), [ - Error( - "'choices' must be an iterable containing (actual value, human readable name) tuples.", - obj=field, - id='fields.E005', - ), - ]) + class Model2(models.Model): + field = models.IntegerField(choices=[0]) + + for model in (Model, Model2): + with self.subTest(model.__name__): + field = model._meta.get_field('field') + self.assertEqual(field.check(), [ + Error( + "'choices' must be an iterable containing (actual " + "value, human readable name) tuples.", + obj=field, + id='fields.E005', + ), + ]) def test_choices_containing_lazy(self): class Model(models.Model): |
