diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index bc41911ca3..5669530aa5 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -401,7 +401,13 @@ class BooleanField(Field): return bool(value) 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) return super(BooleanField, self).formfield(**defaults) diff --git a/tests/regressiontests/model_fields/tests.py b/tests/regressiontests/model_fields/tests.py index ec52668e60..3d232ffeee 100644 --- a/tests/regressiontests/model_fields/tests.py +++ b/tests/regressiontests/model_fields/tests.py @@ -1,6 +1,7 @@ import datetime import unittest import django.test +from django import forms from django.db import models from django.core.exceptions import ValidationError from models import Foo, Bar, Whiz, BigD, BigS @@ -83,10 +84,22 @@ class BooleanFieldTests(unittest.TestCase): def test_booleanfield_get_db_prep_lookup(self): self._test_get_db_prep_lookup(models.BooleanField()) - + def test_nullbooleanfield_get_db_prep_lookup(self): 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): def test_choices_and_field_display(self): """