Author: jkocherhans
Date: 2010-01-12 08:58:24 -0600 (Tue, 12 Jan 2010)
New Revision: 12211

Modified:
   django/trunk/django/forms/models.py
   django/trunk/tests/regressiontests/forms/models.py
Log:
Fixed #12510. Changed ModelChoiceField to stop using some of its superclasses 
implementation. This could cause more than one query when generating choices. 
Thanks, Petr Marhoun and Honza Kral.

Modified: django/trunk/django/forms/models.py
===================================================================
--- django/trunk/django/forms/models.py 2010-01-12 14:26:17 UTC (rev 12210)
+++ django/trunk/django/forms/models.py 2010-01-12 14:58:24 UTC (rev 12211)
@@ -903,8 +903,7 @@
 
     choices = property(_get_choices, ChoiceField._set_choices)
 
-    def clean(self, value):
-        Field.clean(self, value)
+    def to_python(self, value):
         if value in EMPTY_VALUES:
             return None
         try:
@@ -914,6 +913,9 @@
             raise ValidationError(self.error_messages['invalid_choice'])
         return value
 
+    def validate(self, value):
+        return Field.validate(self, value)
+
 class ModelMultipleChoiceField(ModelChoiceField):
     """A MultipleChoiceField whose choices are a model QuerySet."""
     widget = SelectMultiple

Modified: django/trunk/tests/regressiontests/forms/models.py
===================================================================
--- django/trunk/tests/regressiontests/forms/models.py  2010-01-12 14:26:17 UTC 
(rev 12210)
+++ django/trunk/tests/regressiontests/forms/models.py  2010-01-12 14:58:24 UTC 
(rev 12211)
@@ -3,11 +3,13 @@
 import tempfile
 import shutil
 
-from django.db import models
+from django.db import models, connection
+from django.conf import settings
 # Can't import as "forms" due to implementation details in the test suite (the
 # current file is called "forms" and is already imported).
 from django import forms as django_forms
 from django.core.files.storage import FileSystemStorage
+from django.test import TestCase
 
 temp_storage_location = tempfile.mkdtemp()
 temp_storage = FileSystemStorage(location=temp_storage_location)
@@ -41,6 +43,30 @@
 class FileForm(django_forms.Form):
     file1 = django_forms.FileField()
 
+class Group(models.Model):
+    name = models.CharField(max_length=10)
+
+    def __unicode__(self):
+        return u'%s' % self.name
+
+class TestTicket12510(TestCase):
+    ''' It is not necessary to generate choices for ModelChoiceField 
(regression test for #12510). '''
+    def setUp(self):
+        self.groups = [Group.objects.create(name=name) for name in 'abc']
+        self.old_debug = settings.DEBUG
+        # turn debug on to get access to connection.queries
+        settings.DEBUG = True
+
+    def tearDown(self):
+        settings.DEBUG = self.old_debug
+
+    def test_choices_not_fetched_when_not_rendering(self):
+        field = django_forms.ModelChoiceField(Group.objects.order_by('-name'))
+        self.assertEqual('a', field.clean(self.groups[0].pk).name)
+        # only one query is required to pull the model from DB
+        self.assertEqual(1, len(connection.queries))
+
+
 __test__ = {'API_TESTS': """
 >>> from django.forms.models import ModelForm
 >>> from django.core.files.uploadedfile import SimpleUploadedFile

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.


Reply via email to