diff --git a/django/db/models/fields/__init__.py b/django/db/models/fields/__init__.py index 13cec1b..cae7525 100644 --- a/django/db/models/fields/__init__.py +++ b/django/db/models/fields/__init__.py @@ -1028,6 +1028,7 @@ class FloatField(Field): class IntegerField(Field): empty_strings_allowed = False + empty_values = [None] default_error_messages = { 'invalid': _("'%s' value must be an integer."), } diff --git a/tests/forms_tests/models.py b/tests/forms_tests/models.py index bec31d1..6c8d931 100644 --- a/tests/forms_tests/models.py +++ b/tests/forms_tests/models.py @@ -27,7 +27,7 @@ def callable_default(): class Defaults(models.Model): name = models.CharField(max_length=255, default='class default value') - def_date = models.DateField(default = datetime.date(1980, 1, 1)) + def_date = models.DateField(default=datetime.date(1980, 1, 1)) value = models.IntegerField(default=42) callable_default = models.IntegerField(default=callable_default) @@ -63,6 +63,7 @@ class ChoiceFieldModel(models.Model): multi_choice_int = models.ManyToManyField(ChoiceOptionModel, blank=False, related_name='multi_choice_int', default=lambda: [1]) + class OptionalMultiChoiceModel(models.Model): multi_choice = models.ManyToManyField(ChoiceOptionModel, blank=False, related_name='not_relevant', default=lambda: ChoiceOptionModel.objects.filter(name='default')) diff --git a/tests/model_forms/models.py b/tests/model_forms/models.py index a79d9b8..75a1a5f 100644 --- a/tests/model_forms/models.py +++ b/tests/model_forms/models.py @@ -78,7 +78,7 @@ class BetterAuthor(Author): @python_2_unicode_compatible class AuthorProfile(models.Model): writer = models.OneToOneField(Author, primary_key=True) - age = models.PositiveIntegerField() + age = models.PositiveIntegerField(blank=True, null=True) def __str__(self): return "%s is %s" % (self.writer, self.age) diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index c5db011..a5bb76e 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -28,12 +28,12 @@ from .models import (Article, ArticleStatus, BetterAuthor, BigInt, if test_images: from .models import ImageFile, OptionalImageFile + class ImageFileForm(forms.ModelForm): class Meta: model = ImageFile fields = '__all__' - class OptionalImageFileForm(forms.ModelForm): class Meta: model = OptionalImageFile @@ -83,11 +83,11 @@ class DerivedPostForm(forms.ModelForm): class CustomAuthorForm(forms.ModelForm): - name = forms.CharField(required=False) + name = forms.CharField(required=False) - class Meta: - model = Author - fields = '__all__' + class Meta: + model = Author + fields = '__all__' class FlexDatePostForm(forms.ModelForm): @@ -117,7 +117,7 @@ class ArticleForm(forms.ModelForm): class PartialArticleForm(forms.ModelForm): class Meta: model = Article - fields = ('headline','pub_date') + fields = ('headline', 'pub_date') class RoykoForm(forms.ModelForm): @@ -212,6 +212,7 @@ class ModelFormWithMedia(forms.ModelForm): css = { 'all': ('/some/form/css',) } + class Meta: model = TextFile fields = '__all__' @@ -241,7 +242,7 @@ class ModelFormBaseTest(TestCase): ['name', 'slug', 'url']) def test_missing_fields_attribute(self): - with warnings.catch_warnings(record=True) as w: + with warnings.catch_warnings(record=True): warnings.simplefilter("always", PendingDeprecationWarning) class MissingFieldsForm(forms.ModelForm): @@ -275,7 +276,7 @@ class ModelFormBaseTest(TestCase): fields = '__all__' self.assertTrue(isinstance(ReplaceField.base_fields['url'], - forms.fields.BooleanField)) + forms.fields.BooleanField)) def test_replace_field_variant_2(self): # Should have the same result as before, @@ -288,7 +289,7 @@ class ModelFormBaseTest(TestCase): fields = ['url'] self.assertTrue(isinstance(ReplaceField.base_fields['url'], - forms.fields.BooleanField)) + forms.fields.BooleanField)) def test_replace_field_variant_3(self): # Should have the same result as before, @@ -301,7 +302,7 @@ class ModelFormBaseTest(TestCase): fields = [] # url will still appear, since it is explicit above self.assertTrue(isinstance(ReplaceField.base_fields['url'], - forms.fields.BooleanField)) + forms.fields.BooleanField)) def test_override_field(self): class AuthorForm(forms.ModelForm): @@ -430,11 +431,11 @@ class ModelFormBaseTest(TestCase): def test_subclassmeta_form(self): class SomeCategoryForm(forms.ModelForm): - checkbox = forms.BooleanField() + checkbox = forms.BooleanField() - class Meta: - model = Category - fields = '__all__' + class Meta: + model = Category + fields = '__all__' class SubclassMeta(SomeCategoryForm): """ We can also subclass the Meta inner class to change the fields @@ -485,7 +486,6 @@ class TestWidgetForm(forms.ModelForm): } - class TestWidgets(TestCase): def test_base_widgets(self): frm = TestWidgetForm() @@ -514,6 +514,7 @@ class IncompleteCategoryFormWithFields(forms.ModelForm): fields = ('name', 'slug') model = Category + class IncompleteCategoryFormWithExclude(forms.ModelForm): """ A form that replaces the model's url field with a custom one. This should @@ -540,7 +541,16 @@ class ValidationTest(TestCase): assert form.is_valid() +class PositiveintegerModelTest(TestCase): + def setUp(self): + self.author = Author.objects.create(name='Mike Royko') + def test_full_clean_positiveinteger_emptystring(self): + art = AuthorProfile( + writer=self.author, + age='' + ) + self.assertRaises(ValidationError, art.full_clean) # unique/unique_together validation class UniqueTest(TestCase): @@ -601,7 +611,7 @@ class UniqueTest(TestCase): def test_abstract_inherited_unique(self): title = 'Boss' isbn = '12345' - dbook = DerivedBook.objects.create(title=title, author=self.author, isbn=isbn, + DerivedBook.objects.create(title=title, author=self.author, isbn=isbn, pubdate='2012-12-12 00:00') form = DerivedBookForm({'title': 'Other', 'author': self.author.pk, 'isbn': isbn}) self.assertFalse(form.is_valid()) @@ -611,15 +621,15 @@ class UniqueTest(TestCase): def test_abstract_inherited_unique_together(self): title = 'Boss' isbn = '12345' - dbook = DerivedBook.objects.create(title=title, author=self.author, isbn=isbn, + DerivedBook.objects.create(title=title, author=self.author, isbn=isbn, pubdate='2012-12-12 00:00') form = DerivedBookForm({ - 'title': 'Other', - 'author': self.author.pk, - 'isbn': '9876', - 'suffix1': '0', - 'suffix2': '0' - }) + 'title': 'Other', + 'author': self.author.pk, + 'isbn': '9876', + 'suffix1': '0', + 'suffix2': '0' + }) self.assertFalse(form.is_valid()) self.assertEqual(len(form.errors), 1) self.assertEqual(form.errors['__all__'], @@ -627,7 +637,7 @@ class UniqueTest(TestCase): def test_explicitpk_unspecified(self): """Test for primary_key being in the form and failing validation.""" - form = ExplicitPKForm({'key': '', 'desc': '' }) + form = ExplicitPKForm({'key': '', 'desc': ''}) self.assertFalse(form.is_valid()) def test_explicitpk_unique(self): @@ -704,12 +714,13 @@ class UniqueTest(TestCase): "slug": "Django 1.0"}, instance=p) self.assertTrue(form.is_valid()) + class ModelToDictTests(TestCase): """ Tests for forms.models.model_to_dict """ def test_model_to_dict_many_to_many(self): - categories=[ + categories = [ Category(name='TestName1', slug='TestName1', url='url1'), Category(name='TestName2', slug='TestName2', url='url2'), Category(name='TestName3', slug='TestName3', url='url3') @@ -740,6 +751,7 @@ class ModelToDictTests(TestCase): #Ensure many-to-many relation appears as a list self.assertIsInstance(d['categories'], list) + class OldFormForXTests(TestCase): def test_base_form(self): self.assertEqual(Category.objects.count(), 0) @@ -871,12 +883,12 @@ class OldFormForXTests(TestCase): self.assertHTMLEqual(six.text_type(f), '''Name:
Use both first and last names.''') art = Article( - headline='Test article', - slug='test-article', - pub_date=datetime.date(1988, 1, 4), - writer=w, - article='Hello.' - ) + headline='Test article', + slug='test-article', + pub_date=datetime.date(1988, 1, 4), + writer=w, + article='Hello.' + ) art.save() art_id_1 = art.id self.assertEqual(art_id_1 is not None, True) @@ -958,11 +970,11 @@ class OldFormForXTests(TestCase): # Initial values can be provided for model forms f = TestArticleForm( - auto_id=False, - initial={ - 'headline': 'Your headline here', - 'categories': [str(c1.id), str(c2.id)] - }) + auto_id=False, + initial={ + 'headline': 'Your headline here', + 'categories': [str(c1.id), str(c2.id)] + }) self.assertHTMLEqual(f.as_ul(), '''
  • Headline:
  • Slug:
  • Pub date:
  • @@ -1640,6 +1652,7 @@ class OldFormForXTests(TestCase): class CategoryForm(forms.ModelForm): description = forms.CharField() + class Meta: model = Category fields = ['description', 'url'] @@ -1666,7 +1679,7 @@ class OldFormForXTests(TestCase): self.assertHTMLEqual(six.text_type(CustomFieldForExclusionForm()), '''''') - def test_iterable_model_m2m(self) : + def test_iterable_model_m2m(self): colour = Colour.objects.create(name='Blue') form = ColourfulItemForm() self.maxDiff = 1024