mirror of
https://github.com/django/django.git
synced 2025-01-03 15:06:09 +00:00
Fixed #27119 -- Cached BaseFormSet.management_form property
Thanks Tim Graham for the review.
This commit is contained in:
parent
dd2e4d7b5d
commit
d49551bc26
@ -87,7 +87,7 @@ class BaseFormSet(object):
|
|||||||
def __nonzero__(self): # Python 2 compatibility
|
def __nonzero__(self): # Python 2 compatibility
|
||||||
return type(self).__bool__(self)
|
return type(self).__bool__(self)
|
||||||
|
|
||||||
@property
|
@cached_property
|
||||||
def management_form(self):
|
def management_form(self):
|
||||||
"""Returns the ManagementForm instance for this FormSet."""
|
"""Returns the ManagementForm instance for this FormSet."""
|
||||||
if self.is_bound:
|
if self.is_bound:
|
||||||
|
@ -2,14 +2,15 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
from collections import Counter
|
||||||
|
|
||||||
from django.forms import (
|
from django.forms import (
|
||||||
CharField, DateField, FileField, Form, IntegerField, SplitDateTimeField,
|
BaseForm, CharField, DateField, FileField, Form, IntegerField,
|
||||||
ValidationError, formsets,
|
SplitDateTimeField, ValidationError, formsets,
|
||||||
)
|
)
|
||||||
from django.forms.formsets import BaseFormSet, formset_factory
|
from django.forms.formsets import BaseFormSet, formset_factory
|
||||||
from django.forms.utils import ErrorList
|
from django.forms.utils import ErrorList
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase, mock
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text
|
||||||
|
|
||||||
|
|
||||||
@ -165,6 +166,32 @@ class FormsFormsetTestCase(SimpleTestCase):
|
|||||||
self.assertFalse(formset.is_valid())
|
self.assertFalse(formset.is_valid())
|
||||||
self.assertEqual(formset.errors, [{'votes': ['This field is required.']}])
|
self.assertEqual(formset.errors, [{'votes': ['This field is required.']}])
|
||||||
|
|
||||||
|
def test_formset_validation_count(self):
|
||||||
|
"""
|
||||||
|
A formset's ManagementForm is validated once per FormSet.is_valid()
|
||||||
|
call and each form of the formset is cleaned once.
|
||||||
|
"""
|
||||||
|
def make_method_counter(func):
|
||||||
|
"""Add a counter to func for the number of times it's called."""
|
||||||
|
counter = Counter()
|
||||||
|
counter.call_count = 0
|
||||||
|
|
||||||
|
def mocked_func(*args, **kwargs):
|
||||||
|
counter.call_count += 1
|
||||||
|
return func(*args, **kwargs)
|
||||||
|
|
||||||
|
return mocked_func, counter
|
||||||
|
|
||||||
|
mocked_is_valid, is_valid_counter = make_method_counter(formsets.ManagementForm.is_valid)
|
||||||
|
mocked_full_clean, full_clean_counter = make_method_counter(BaseForm.full_clean)
|
||||||
|
formset = self.make_choiceformset([('Calexico', '100'), ('Any1', '42'), ('Any2', '101')])
|
||||||
|
|
||||||
|
with mock.patch('django.forms.formsets.ManagementForm.is_valid', mocked_is_valid), \
|
||||||
|
mock.patch('django.forms.forms.BaseForm.full_clean', mocked_full_clean):
|
||||||
|
self.assertTrue(formset.is_valid())
|
||||||
|
self.assertEqual(is_valid_counter.call_count, 1)
|
||||||
|
self.assertEqual(full_clean_counter.call_count, 4)
|
||||||
|
|
||||||
def test_formset_has_changed(self):
|
def test_formset_has_changed(self):
|
||||||
# FormSet instances has_changed method will be True if any data is
|
# FormSet instances has_changed method will be True if any data is
|
||||||
# passed to his forms, even if the formset didn't validate
|
# passed to his forms, even if the formset didn't validate
|
||||||
|
Loading…
Reference in New Issue
Block a user