Skip to content

Commit

Permalink
Fixed #12510. Changed ModelChoiceField to stop using some of its supe…
Browse files Browse the repository at this point in the history
…rclasses implementation. This could cause more than one query when generating choices. Thanks, Petr Marhoun and Honza Kral.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@12211 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information
jkocherhans committed Jan 12, 2010
1 parent eb2cbb6 commit 223b272
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 3 deletions.
6 changes: 4 additions & 2 deletions django/forms/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -903,8 +903,7 @@ def _get_choices(self):

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:
Expand All @@ -914,6 +913,9 @@ def clean(self, value):
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
Expand Down
28 changes: 27 additions & 1 deletion tests/regressiontests/forms/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -41,6 +43,30 @@ class FileModel(models.Model):
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
Expand Down

0 comments on commit 223b272

Please sign in to comment.