Fixed #9640, #10549: BooleanFields with choices, a default, and null=False now correctly doesn't generate a blank option.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10500 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Jacob Kaplan-Moss 2009-04-10 19:54:31 +00:00
parent 3524c74f0b
commit a34b718192
2 changed files with 21 additions and 2 deletions

View File

@ -401,7 +401,13 @@ class BooleanField(Field):
return bool(value) return bool(value)
def formfield(self, **kwargs): def formfield(self, **kwargs):
defaults = {'form_class': forms.BooleanField} # Unlike most fields, BooleanField figures out include_blank from
# self.null instead of self.blank.
if self.choices:
include_blank = self.null or not (self.has_default() or 'initial' in kwargs)
defaults = {'choices': self.get_choices(include_blank=include_blank)}
else:
defaults = {'form_class': forms.BooleanField}
defaults.update(kwargs) defaults.update(kwargs)
return super(BooleanField, self).formfield(**defaults) return super(BooleanField, self).formfield(**defaults)

View File

@ -1,6 +1,7 @@
import datetime import datetime
import unittest import unittest
import django.test import django.test
from django import forms
from django.db import models from django.db import models
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from models import Foo, Bar, Whiz, BigD, BigS from models import Foo, Bar, Whiz, BigD, BigS
@ -83,10 +84,22 @@ class BooleanFieldTests(unittest.TestCase):
def test_booleanfield_get_db_prep_lookup(self): def test_booleanfield_get_db_prep_lookup(self):
self._test_get_db_prep_lookup(models.BooleanField()) self._test_get_db_prep_lookup(models.BooleanField())
def test_nullbooleanfield_get_db_prep_lookup(self): def test_nullbooleanfield_get_db_prep_lookup(self):
self._test_get_db_prep_lookup(models.NullBooleanField()) self._test_get_db_prep_lookup(models.NullBooleanField())
def test_booleanfield_choices_blank(self):
"""
Test that BooleanField with choices and defaults doesn't generate a
formfield with the blank option (#9640, #10549).
"""
choices = [(1, u'Si'), (2, 'No')]
f = models.BooleanField(choices=choices, default=1, null=True)
self.assertEqual(f.formfield().choices, [('', '---------')] + choices)
f = models.BooleanField(choices=choices, default=1, null=False)
self.assertEqual(f.formfield().choices, choices)
class ChoicesTests(django.test.TestCase): class ChoicesTests(django.test.TestCase):
def test_choices_and_field_display(self): def test_choices_and_field_display(self):
""" """