mirror of
				https://github.com/django/django.git
				synced 2025-10-30 00:56:09 +00:00 
			
		
		
		
	[1.7.x] Fixed #23098 -- Checked that lazy choices are not evaluated too soon
Thanks Matthieu Agopian for the report.
Backport of 2f73b527dd from master.
			
			
This commit is contained in:
		| @@ -730,10 +730,12 @@ class Field(RegisterLookupMixin): | ||||
|         """Returns choices with a default blank choices included, for use | ||||
|         as SelectField choices for this field.""" | ||||
|         blank_defined = False | ||||
|         for choice, __ in self.choices: | ||||
|             if choice in ('', None): | ||||
|                 blank_defined = True | ||||
|                 break | ||||
|         named_groups = self.choices and isinstance(self.choices[0][1], (list, tuple)) | ||||
|         if not named_groups: | ||||
|             for choice, __ in self.choices: | ||||
|                 if choice in ('', None): | ||||
|                     blank_defined = True | ||||
|                     break | ||||
|  | ||||
|         first_choice = (blank_choice if include_blank and | ||||
|                         not blank_defined else []) | ||||
|   | ||||
| @@ -416,6 +416,13 @@ class ValidationTest(test.TestCase): | ||||
|         f = models.CharField(choices=[('', '<><>'), ('a', 'A')]) | ||||
|         self.assertEqual(f.get_choices(True), [('', '<><>'), ('a', 'A')]) | ||||
|  | ||||
|     def test_charfield_get_choices_doesnt_evaluate_lazy_strings(self): | ||||
|         # Regression test for #23098 | ||||
|         # Will raise ZeroDivisionError if lazy is evaluated | ||||
|         lazy_func = lazy(lambda x: 0/0, int) | ||||
|         f = models.CharField(choices=[(lazy_func('group'), (('a', 'A'), ('b', 'B')))]) | ||||
|         self.assertEqual(f.get_choices(True)[0], ('', '---------')) | ||||
|  | ||||
|     def test_choices_validation_supports_named_groups(self): | ||||
|         f = models.IntegerField( | ||||
|             choices=(('group', ((10, 'A'), (20, 'B'))), (30, 'C'))) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user