Kaydet (Commit) e16c48e0 authored tarafından Aymeric Augustin's avatar Aymeric Augustin

Fixed #15124 -- Changed the default for BooleanField.

Thanks to the many contributors who updated and improved the patch over
the life of this ticket.
üst ae417dd4
...@@ -11,10 +11,12 @@ class FlatPage(models.Model): ...@@ -11,10 +11,12 @@ class FlatPage(models.Model):
url = models.CharField(_('URL'), max_length=100, db_index=True) url = models.CharField(_('URL'), max_length=100, db_index=True)
title = models.CharField(_('title'), max_length=200) title = models.CharField(_('title'), max_length=200)
content = models.TextField(_('content'), blank=True) content = models.TextField(_('content'), blank=True)
enable_comments = models.BooleanField(_('enable comments')) enable_comments = models.BooleanField(_('enable comments'), default=False)
template_name = models.CharField(_('template name'), max_length=70, blank=True, template_name = models.CharField(_('template name'), max_length=70, blank=True,
help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'.")) help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."))
registration_required = models.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page.")) registration_required = models.BooleanField(_('registration required'),
help_text=_("If this is checked, only logged-in users will be able to view the page."),
default=False)
sites = models.ManyToManyField(Site) sites = models.ManyToManyField(Site)
class Meta: class Meta:
......
...@@ -620,8 +620,6 @@ class BooleanField(Field): ...@@ -620,8 +620,6 @@ class BooleanField(Field):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
kwargs['blank'] = True kwargs['blank'] = True
if 'default' not in kwargs and not kwargs.get('null'):
kwargs['default'] = False
Field.__init__(self, *args, **kwargs) Field.__init__(self, *args, **kwargs)
def get_internal_type(self): def get_internal_type(self):
......
...@@ -377,6 +377,10 @@ The default form widget for this field is a ...@@ -377,6 +377,10 @@ The default form widget for this field is a
If you need to accept :attr:`~Field.null` values then use If you need to accept :attr:`~Field.null` values then use
:class:`NullBooleanField` instead. :class:`NullBooleanField` instead.
.. versionchanged:: 1.6
The default value of ``BooleanField`` was changed from ``False`` to
``None`` when :attr:`Field.default` isn't defined.
``CharField`` ``CharField``
------------- -------------
......
...@@ -292,6 +292,20 @@ should either restore Django's defaults at the end of each request, force an ...@@ -292,6 +292,20 @@ should either restore Django's defaults at the end of each request, force an
appropriate value at the beginning of each request, or disable persistent appropriate value at the beginning of each request, or disable persistent
connections. connections.
``BooleanField`` no longer defaults to ``False``
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When a :class:`~django.db.models.BooleanField` doesn't have an explicit
:attr:`~django.db.models.Field.default`, the implicit default value is
``None``. In previous version of Django, it was ``False``, but that didn't
represent accurantely the lack of a value.
Code that relies on the default value being ``False`` may raise an exception
when saving new model instances to the database, because ``None`` isn't an
acceptable value for a :class:`~django.db.models.BooleanField`. You should
either specify ``default=False`` explicitly on the field definition, or ensure
the field is set to ``True`` or ``False`` before saving the object.
Translations and comments in templates Translations and comments in templates
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
......
...@@ -6,7 +6,7 @@ from decimal import Decimal ...@@ -6,7 +6,7 @@ from decimal import Decimal
from django import test from django import test
from django import forms from django import forms
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models, IntegrityError
from django.db.models.fields.files import FieldFile from django.db.models.fields.files import FieldFile
from django.utils import six from django.utils import six
from django.utils import unittest from django.utils import unittest
...@@ -265,6 +265,18 @@ class BooleanFieldTests(unittest.TestCase): ...@@ -265,6 +265,18 @@ class BooleanFieldTests(unittest.TestCase):
self.assertEqual(mc.bf.bfield, False) self.assertEqual(mc.bf.bfield, False)
self.assertEqual(mc.nbf.nbfield, False) self.assertEqual(mc.nbf.nbfield, False)
def test_null_default(self):
"""
Check that a BooleanField defaults to None -- which isn't
a valid value (#15124).
"""
b = BooleanModel()
self.assertIsNone(b.bfield)
with self.assertRaises(IntegrityError):
b.save()
nb = NullBooleanModel()
self.assertIsNone(nb.nbfield)
nb.save() # no error
class ChoicesTests(test.TestCase): class ChoicesTests(test.TestCase):
def test_choices_and_field_display(self): def test_choices_and_field_display(self):
......
...@@ -181,11 +181,11 @@ class ModelInheritanceTest(TestCase): ...@@ -181,11 +181,11 @@ class ModelInheritanceTest(TestCase):
""" """
Regression test for #6755 Regression test for #6755
""" """
r = Restaurant(serves_pizza=False) r = Restaurant(serves_pizza=False, serves_hot_dogs=False)
r.save() r.save()
self.assertEqual(r.id, r.place_ptr_id) self.assertEqual(r.id, r.place_ptr_id)
orig_id = r.id orig_id = r.id
r = Restaurant(place_ptr_id=orig_id, serves_pizza=True) r = Restaurant(place_ptr_id=orig_id, serves_pizza=True, serves_hot_dogs=False)
r.save() r.save()
self.assertEqual(r.id, orig_id) self.assertEqual(r.id, orig_id)
self.assertEqual(r.id, r.place_ptr_id) self.assertEqual(r.id, r.place_ptr_id)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment