mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #17642 -- Added min_num support to modelformsets, inlines, and the admin.
Thanks Stephen Burrows for work on the patch as well.
Forwardport of 2914f66983
from stable/1.7.x
This commit is contained in:
parent
860d31ac7a
commit
4ef10f245a
15 changed files with 229 additions and 61 deletions
|
@ -4,17 +4,17 @@ import warnings
|
|||
|
||||
from django.contrib import admin
|
||||
from django.contrib.admin.sites import AdminSite
|
||||
from django.contrib.auth.models import User
|
||||
from django.contrib.contenttypes.admin import GenericTabularInline
|
||||
from django.contrib.contenttypes.forms import generic_inlineformset_factory
|
||||
from django.forms.formsets import DEFAULT_MAX_NUM
|
||||
from django.forms.models import ModelForm
|
||||
from django.test import TestCase, override_settings
|
||||
from django.test import TestCase, override_settings, RequestFactory
|
||||
from django.utils.deprecation import RemovedInDjango19Warning
|
||||
|
||||
# local test models
|
||||
from .admin import MediaInline, MediaPermanentInline
|
||||
from .models import (Episode, EpisodeExtra, EpisodeMaxNum, Media,
|
||||
EpisodePermanent, Category)
|
||||
from .admin import MediaInline, MediaPermanentInline, site as admin_site
|
||||
from .models import Episode, Media, EpisodePermanent, Category
|
||||
|
||||
|
||||
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',),
|
||||
|
@ -137,6 +137,7 @@ class GenericInlineAdminParametersTest(TestCase):
|
|||
|
||||
def setUp(self):
|
||||
self.client.login(username='super', password='secret')
|
||||
self.factory = RequestFactory()
|
||||
|
||||
def tearDown(self):
|
||||
self.client.logout()
|
||||
|
@ -166,9 +167,18 @@ class GenericInlineAdminParametersTest(TestCase):
|
|||
"""
|
||||
With extra=0, there should be one form.
|
||||
"""
|
||||
e = self._create_object(EpisodeExtra)
|
||||
response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episodeextra/%s/' % e.pk)
|
||||
formset = response.context['inline_admin_formsets'][0].formset
|
||||
class ExtraInline(GenericTabularInline):
|
||||
model = Media
|
||||
extra = 0
|
||||
|
||||
modeladmin = admin.ModelAdmin(Episode, admin_site)
|
||||
modeladmin.inlines = [ExtraInline]
|
||||
|
||||
e = self._create_object(Episode)
|
||||
request = self.factory.get('/generic_inline_admin/admin/generic_inline_admin/episode/%s/' % e.pk)
|
||||
request.user = User(username='super', is_superuser=True)
|
||||
response = modeladmin.changeform_view(request, object_id=str(e.pk))
|
||||
formset = response.context_data['inline_admin_formsets'][0].formset
|
||||
self.assertEqual(formset.total_form_count(), 1)
|
||||
self.assertEqual(formset.initial_form_count(), 1)
|
||||
|
||||
|
@ -176,12 +186,43 @@ class GenericInlineAdminParametersTest(TestCase):
|
|||
"""
|
||||
With extra=5 and max_num=2, there should be only 2 forms.
|
||||
"""
|
||||
e = self._create_object(EpisodeMaxNum)
|
||||
response = self.client.get('/generic_inline_admin/admin/generic_inline_admin/episodemaxnum/%s/' % e.pk)
|
||||
formset = response.context['inline_admin_formsets'][0].formset
|
||||
class MaxNumInline(GenericTabularInline):
|
||||
model = Media
|
||||
extra = 5
|
||||
max_num = 2
|
||||
|
||||
modeladmin = admin.ModelAdmin(Episode, admin_site)
|
||||
modeladmin.inlines = [MaxNumInline]
|
||||
|
||||
e = self._create_object(Episode)
|
||||
request = self.factory.get('/generic_inline_admin/admin/generic_inline_admin/episode/%s/' % e.pk)
|
||||
request.user = User(username='super', is_superuser=True)
|
||||
response = modeladmin.changeform_view(request, object_id=str(e.pk))
|
||||
formset = response.context_data['inline_admin_formsets'][0].formset
|
||||
self.assertEqual(formset.total_form_count(), 2)
|
||||
self.assertEqual(formset.initial_form_count(), 1)
|
||||
|
||||
def testMinNumParam(self):
|
||||
"""
|
||||
With extra=3 and min_num=2, there should be six forms.
|
||||
See #22628 - this will change when that's fixed.
|
||||
"""
|
||||
class MinNumInline(GenericTabularInline):
|
||||
model = Media
|
||||
extra = 3
|
||||
min_num = 2
|
||||
|
||||
modeladmin = admin.ModelAdmin(Episode, admin_site)
|
||||
modeladmin.inlines = [MinNumInline]
|
||||
|
||||
e = self._create_object(Episode)
|
||||
request = self.factory.get('/generic_inline_admin/admin/generic_inline_admin/episode/%s/' % e.pk)
|
||||
request.user = User(username='super', is_superuser=True)
|
||||
response = modeladmin.changeform_view(request, object_id=str(e.pk))
|
||||
formset = response.context_data['inline_admin_formsets'][0].formset
|
||||
self.assertEqual(formset.total_form_count(), 6)
|
||||
self.assertEqual(formset.initial_form_count(), 1)
|
||||
|
||||
|
||||
@override_settings(PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',),
|
||||
ROOT_URLCONF="generic_inline_admin.urls")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue