mirror of
https://github.com/django/django.git
synced 2025-10-24 06:06:09 +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:
committed by
Tim Graham
parent
860d31ac7a
commit
4ef10f245a
@@ -1,13 +1,14 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.contrib.admin import TabularInline, ModelAdmin
|
||||
from django.contrib.admin.tests import AdminSeleniumWebDriverTestCase
|
||||
from django.contrib.admin.helpers import InlineAdminForm
|
||||
from django.contrib.auth.models import User, Permission
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.test import TestCase, override_settings
|
||||
from django.test import TestCase, override_settings, RequestFactory
|
||||
|
||||
# local test models
|
||||
from .admin import InnerInline
|
||||
from .admin import InnerInline, site as admin_site
|
||||
from .models import (Holder, Inner, Holder2, Inner2, Holder3, Inner3, Person,
|
||||
OutfitItem, Fashionista, Teacher, Parent, Child, Author, Book, Profile,
|
||||
ProfileCollection, ParentModelWithCustomPk, ChildModel1, ChildModel2,
|
||||
@@ -28,6 +29,7 @@ class TestInline(TestCase):
|
||||
|
||||
result = self.client.login(username='super', password='secret')
|
||||
self.assertEqual(result, True)
|
||||
self.factory = RequestFactory()
|
||||
|
||||
def tearDown(self):
|
||||
self.client.logout()
|
||||
@@ -221,6 +223,62 @@ class TestInline(TestCase):
|
||||
self.assertContains(response, max_forms_input % 2)
|
||||
self.assertContains(response, total_forms_hidden)
|
||||
|
||||
def test_min_num(self):
|
||||
"""
|
||||
Ensure that min_num and extra determine number of forms.
|
||||
"""
|
||||
class MinNumInline(TabularInline):
|
||||
model = BinaryTree
|
||||
min_num = 2
|
||||
extra = 3
|
||||
|
||||
modeladmin = ModelAdmin(BinaryTree, admin_site)
|
||||
modeladmin.inlines = [MinNumInline]
|
||||
|
||||
min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="2" />'
|
||||
total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="5" />'
|
||||
|
||||
request = self.factory.get('/admin/admin_inlines/binarytree/add/')
|
||||
request.user = User(username='super', is_superuser=True)
|
||||
response = modeladmin.changeform_view(request)
|
||||
self.assertContains(response, min_forms)
|
||||
self.assertContains(response, total_forms)
|
||||
|
||||
def test_custom_min_num(self):
|
||||
"""
|
||||
Ensure that get_min_num is called and used correctly.
|
||||
See #22628 - this will change when that's fixed.
|
||||
"""
|
||||
bt_head = BinaryTree.objects.create(name="Tree Head")
|
||||
BinaryTree.objects.create(name="First Child", parent=bt_head)
|
||||
|
||||
class MinNumInline(TabularInline):
|
||||
model = BinaryTree
|
||||
extra = 3
|
||||
|
||||
def get_min_num(self, request, obj=None, **kwargs):
|
||||
if obj:
|
||||
return 5
|
||||
return 2
|
||||
|
||||
modeladmin = ModelAdmin(BinaryTree, admin_site)
|
||||
modeladmin.inlines = [MinNumInline]
|
||||
|
||||
min_forms = '<input id="id_binarytree_set-MIN_NUM_FORMS" name="binarytree_set-MIN_NUM_FORMS" type="hidden" value="%d" />'
|
||||
total_forms = '<input id="id_binarytree_set-TOTAL_FORMS" name="binarytree_set-TOTAL_FORMS" type="hidden" value="%d" />'
|
||||
|
||||
request = self.factory.get('/admin/admin_inlines/binarytree/add/')
|
||||
request.user = User(username='super', is_superuser=True)
|
||||
response = modeladmin.changeform_view(request)
|
||||
self.assertContains(response, min_forms % 2)
|
||||
self.assertContains(response, total_forms % 5)
|
||||
|
||||
request = self.factory.get("/admin/admin_inlines/binarytree/%d/" % bt_head.id)
|
||||
request.user = User(username='super', is_superuser=True)
|
||||
response = modeladmin.changeform_view(request, object_id=str(bt_head.id))
|
||||
self.assertContains(response, min_forms % 5)
|
||||
self.assertContains(response, total_forms % 9)
|
||||
|
||||
def test_inline_nonauto_noneditable_pk(self):
|
||||
response = self.client.get('/admin/admin_inlines/author/add/')
|
||||
self.assertContains(response,
|
||||
|
||||
Reference in New Issue
Block a user