summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Kaplan-Moss <jacob@jacobian.org>2008-06-19 21:15:33 +0000
committerJacob Kaplan-Moss <jacob@jacobian.org>2008-06-19 21:15:33 +0000
commite637f4723225d630e6066a04558a3549c83f8a5a (patch)
treef98061bb29e2b860ad53cb8e33f7a6bdabe0d274
parent5d09d8769d7eb7fd8dffdf5c0705e25173c59006 (diff)
Fixed #7475: fixed a possible race condition in ModelChoiceIterator. Thanks, esaj.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@7710 bcc190cf-cafb-0310-a4f2-bffc1f526a37
-rw-r--r--django/newforms/models.py17
1 files changed, 12 insertions, 5 deletions
diff --git a/django/newforms/models.py b/django/newforms/models.py
index 78a204125f..eb6d01e787 100644
--- a/django/newforms/models.py
+++ b/django/newforms/models.py
@@ -285,11 +285,17 @@ class ModelChoiceIterator(object):
def __iter__(self):
if self.field.empty_label is not None:
yield (u"", self.field.empty_label)
- for obj in self.queryset:
- yield (obj.pk, self.field.label_from_instance(obj))
- # Clear the QuerySet cache if required.
- if not self.field.cache_choices:
- self.queryset._result_cache = None
+ if self.field.cache_choices:
+ if self.field.choice_cache is None:
+ self.field.choice_cache = [
+ (obj.pk, self.field.label_from_instance(obj))
+ for obj in self.queryset.all()
+ ]
+ for choice in self.field.choice_cache:
+ yield choice
+ else:
+ for obj in self.queryset.all():
+ yield (obj.pk, self.field.label_from_instance(obj))
class ModelChoiceField(ChoiceField):
"""A ChoiceField whose choices are a model QuerySet."""
@@ -311,6 +317,7 @@ class ModelChoiceField(ChoiceField):
Field.__init__(self, required, widget, label, initial, help_text,
*args, **kwargs)
self.queryset = queryset
+ self.choice_cache = None
def _get_queryset(self):
return self._queryset