From 8c2fd050f80f528cc1609c1a7f16901194834831 Mon Sep 17 00:00:00 2001 From: Ramiro Morales Date: Tue, 21 May 2013 18:32:39 -0300 Subject: Made fix for #9321 less buggy and more effective. Don't try to be smart about building a good-looking help string because it evaluates translations too early, simply use the same old strategy as before. Thanks Donald Stufft for the report. Also, actually fix the case reported by the OP by special-casing CheckboxSelectMultiple. Added tests. Refs #9321. --- tests/model_forms/models.py | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'tests/model_forms/models.py') diff --git a/tests/model_forms/models.py b/tests/model_forms/models.py index a79d9b8c5b..9c5e097106 100644 --- a/tests/model_forms/models.py +++ b/tests/model_forms/models.py @@ -255,3 +255,7 @@ class Colour(models.Model): class ColourfulItem(models.Model): name = models.CharField(max_length=50) colours = models.ManyToManyField(Colour) + +class ArticleStatusNote(models.Model): + name = models.CharField(max_length=20) + status = models.ManyToManyField(ArticleStatus) -- cgit v1.3 From d321d1acf0fdf00247e78b9686be84c18b35b9d8 Mon Sep 17 00:00:00 2001 From: Tim Graham Date: Tue, 28 May 2013 09:56:14 -0400 Subject: Fixed #20228 - Documented unique_for_date and exclude behavior. Thanks Deepak Thukral for the patch. --- docs/ref/models/fields.txt | 7 ++++++- tests/model_forms/models.py | 12 +++++++++++- tests/model_forms/tests.py | 25 ++++++++++++++++++++++++- 3 files changed, 41 insertions(+), 3 deletions(-) (limited to 'tests/model_forms/models.py') diff --git a/docs/ref/models/fields.txt b/docs/ref/models/fields.txt index f61ebe6684..8146dfd341 100644 --- a/docs/ref/models/fields.txt +++ b/docs/ref/models/fields.txt @@ -293,7 +293,12 @@ records with the same ``title`` and ``pub_date``. Note that if you set this to point to a :class:`DateTimeField`, only the date portion of the field will be considered. -This is enforced by model validation but not at the database level. +This is enforced by :meth:`Model.validate_unique()` during model validation +but not at the database level. If any :attr:`~Field.unique_for_date` constraint +involves fields that are not part of a :class:`~django.forms.ModelForm` (for +example, if one of the fields is listed in ``exclude`` or has +:attr:`editable=False`), :meth:`Model.validate_unique()` will +skip validation for that particular constraint. ``unique_for_month`` -------------------- diff --git a/tests/model_forms/models.py b/tests/model_forms/models.py index 9c5e097106..610dc34001 100644 --- a/tests/model_forms/models.py +++ b/tests/model_forms/models.py @@ -207,7 +207,17 @@ class Post(models.Model): posted = models.DateField() def __str__(self): - return self.name + return self.title + +@python_2_unicode_compatible +class DateTimePost(models.Model): + title = models.CharField(max_length=50, unique_for_date='posted', blank=True) + slug = models.CharField(max_length=50, unique_for_year='posted', blank=True) + subtitle = models.CharField(max_length=50, unique_for_month='posted', blank=True) + posted = models.DateTimeField(editable=False) + + def __str__(self): + return self.title class DerivedPost(Post): pass diff --git a/tests/model_forms/tests.py b/tests/model_forms/tests.py index 5219804e0c..58dde13a8a 100644 --- a/tests/model_forms/tests.py +++ b/tests/model_forms/tests.py @@ -24,7 +24,7 @@ from .models import (Article, ArticleStatus, BetterAuthor, BigInt, DerivedPost, ExplicitPK, FlexibleDatePost, ImprovedArticle, ImprovedArticleWithParentLink, Inventory, Post, Price, Product, TextFile, AuthorProfile, Colour, ColourfulItem, - ArticleStatusNote, test_images) + ArticleStatusNote, DateTimePost, test_images) if test_images: from .models import ImageFile, OptionalImageFile @@ -76,6 +76,12 @@ class PostForm(forms.ModelForm): fields = '__all__' +class DateTimePostForm(forms.ModelForm): + class Meta: + model = DateTimePost + fields = '__all__' + + class DerivedPostForm(forms.ModelForm): class Meta: model = DerivedPost @@ -682,6 +688,23 @@ class UniqueTest(TestCase): self.assertEqual(len(form.errors), 1) self.assertEqual(form.errors['posted'], ['This field is required.']) + def test_unique_for_date_in_exclude(self): + """If the date for unique_for_* constraints is excluded from the + ModelForm (in this case 'posted' has editable=False, then the + constraint should be ignored.""" + p = DateTimePost.objects.create(title="Django 1.0 is released", + slug="Django 1.0", subtitle="Finally", + posted=datetime.datetime(2008, 9, 3, 10, 10, 1)) + # 'title' has unique_for_date='posted' + form = DateTimePostForm({'title': "Django 1.0 is released", 'posted': '2008-09-03'}) + self.assertTrue(form.is_valid()) + # 'slug' has unique_for_year='posted' + form = DateTimePostForm({'slug': "Django 1.0", 'posted': '2008-01-01'}) + self.assertTrue(form.is_valid()) + # 'subtitle' has unique_for_month='posted' + form = DateTimePostForm({'subtitle': "Finally", 'posted': '2008-09-30'}) + self.assertTrue(form.is_valid()) + def test_inherited_unique_for_date(self): p = Post.objects.create(title="Django 1.0 is released", slug="Django 1.0", subtitle="Finally", posted=datetime.date(2008, 9, 3)) -- cgit v1.3