diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index 7b3018e..a28f570 100644
a
|
b
|
class InlineModelAdmin(BaseModelAdmin):
|
1109 | 1109 | template = None |
1110 | 1110 | verbose_name = None |
1111 | 1111 | verbose_name_plural = None |
| 1112 | classes = [] |
1112 | 1113 | |
1113 | 1114 | def __init__(self, parent_model, admin_site): |
1114 | 1115 | self.admin_site = admin_site |
… |
… |
class InlineModelAdmin(BaseModelAdmin):
|
1125 | 1126 | js = [] |
1126 | 1127 | if self.prepopulated_fields: |
1127 | 1128 | js.append('js/urlify.js') |
| 1129 | if 'collapse' in self.classes: |
| 1130 | js.append('js/admin/CollapsedFieldsets.js') |
1128 | 1131 | if self.filter_vertical or self.filter_horizontal: |
1129 | 1132 | js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js']) |
1130 | 1133 | return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js]) |
… |
… |
class InlineModelAdmin(BaseModelAdmin):
|
1151 | 1154 | "formfield_callback": curry(self.formfield_for_dbfield, request=request), |
1152 | 1155 | "extra": self.extra, |
1153 | 1156 | "max_num": self.max_num, |
| 1157 | "classes": self.classes, |
1154 | 1158 | } |
1155 | 1159 | defaults.update(kwargs) |
1156 | 1160 | return inlineformset_factory(self.parent_model, self.model, **defaults) |
diff --git a/django/contrib/admin/templates/admin/edit_inline/stacked.html b/django/contrib/admin/templates/admin/edit_inline/stacked.html
index 494c351..eb2885a 100644
a
|
b
|
|
1 | 1 | {% load i18n %} |
2 | 2 | <div class="inline-group"> |
| 3 | <fieldset class="module {% for class in inline_admin_formset.formset.classes %}{{class}}{% endfor %}"> |
3 | 4 | <h2>{{ inline_admin_formset.opts.verbose_name_plural|title }}</h2> |
4 | 5 | {{ inline_admin_formset.formset.management_form }} |
5 | 6 | {{ inline_admin_formset.formset.non_form_errors }} |
… |
… |
|
25 | 26 | {# <ul class="tools"> #} |
26 | 27 | {# <li><a class="add" href="">Add another {{ inline_admin_formset.opts.verbose_name|title }}</a></li> #} |
27 | 28 | {# </ul> #} |
| 29 | </fieldset> |
28 | 30 | </div> |
diff --git a/django/contrib/admin/templates/admin/edit_inline/tabular.html b/django/contrib/admin/templates/admin/edit_inline/tabular.html
index ecc14a4..04a6e4f 100644
a
|
b
|
|
2 | 2 | <div class="inline-group"> |
3 | 3 | <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}"> |
4 | 4 | {{ inline_admin_formset.formset.management_form }} |
5 | | <fieldset class="module"> |
| 5 | <fieldset class="module {% for class in inline_admin_formset.formset.classes %}{{class}}{% endfor %}"> |
6 | 6 | <h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2> |
7 | 7 | {{ inline_admin_formset.formset.non_form_errors }} |
8 | 8 | <table> |
diff --git a/django/contrib/contenttypes/generic.py b/django/contrib/contenttypes/generic.py
index 5564548..00cf6f4 100644
a
|
b
|
class BaseGenericInlineFormSet(BaseModelFormSet):
|
337 | 337 | def generic_inlineformset_factory(model, form=ModelForm, |
338 | 338 | formset=BaseGenericInlineFormSet, |
339 | 339 | ct_field="content_type", fk_field="object_id", |
340 | | fields=None, exclude=None, |
| 340 | fields=None, exclude=None, classes=[], |
341 | 341 | extra=3, can_order=False, can_delete=True, |
342 | 342 | max_num=0, |
343 | 343 | formfield_callback=lambda f: f.formfield()): |
… |
… |
def generic_inlineformset_factory(model, form=ModelForm,
|
362 | 362 | exclude = [ct_field.name, fk_field.name] |
363 | 363 | FormSet = modelformset_factory(model, form=form, |
364 | 364 | formfield_callback=formfield_callback, |
365 | | formset=formset, |
| 365 | formset=formset, classes=classes, |
366 | 366 | extra=extra, can_delete=can_delete, can_order=can_order, |
367 | 367 | fields=fields, exclude=exclude, max_num=max_num) |
368 | 368 | FormSet.ct_field = ct_field |
diff --git a/django/forms/formsets.py b/django/forms/formsets.py
index bb8e310..96a1e03 100644
a
|
b
|
class BaseFormSet(StrAndUnicode):
|
302 | 302 | return mark_safe(u'\n'.join([unicode(self.management_form), forms])) |
303 | 303 | |
304 | 304 | def formset_factory(form, formset=BaseFormSet, extra=1, can_order=False, |
305 | | can_delete=False, max_num=0): |
| 305 | can_delete=False, max_num=0, classes=[]): |
306 | 306 | """Return a FormSet for the given form class.""" |
307 | | attrs = {'form': form, 'extra': extra, |
| 307 | attrs = {'form': form, 'extra': extra, 'classes': classes, |
308 | 308 | 'can_order': can_order, 'can_delete': can_delete, |
309 | 309 | 'max_num': max_num} |
310 | 310 | return type(form.__name__ + 'FormSet', (formset,), attrs) |
diff --git a/django/forms/models.py b/django/forms/models.py
index 86eecee..5585ace 100644
a
|
b
|
class BaseModelFormSet(BaseFormSet):
|
576 | 576 | super(BaseModelFormSet, self).add_fields(form, index) |
577 | 577 | |
578 | 578 | def modelformset_factory(model, form=ModelForm, formfield_callback=lambda f: f.formfield(), |
579 | | formset=BaseModelFormSet, |
| 579 | formset=BaseModelFormSet, classes=[], |
580 | 580 | extra=1, can_delete=False, can_order=False, |
581 | 581 | max_num=0, fields=None, exclude=None): |
582 | 582 | """ |
… |
… |
def modelformset_factory(model, form=ModelForm, formfield_callback=lambda f: f.f
|
585 | 585 | form = modelform_factory(model, form=form, fields=fields, exclude=exclude, |
586 | 586 | formfield_callback=formfield_callback) |
587 | 587 | FormSet = formset_factory(form, formset, extra=extra, max_num=max_num, |
588 | | can_order=can_order, can_delete=can_delete) |
| 588 | can_order=can_order, can_delete=can_delete, |
| 589 | classes=classes) |
589 | 590 | FormSet.model = model |
590 | 591 | return FormSet |
591 | 592 | |
… |
… |
def _get_foreign_key(parent_model, model, fk_name=None):
|
694 | 695 | |
695 | 696 | def inlineformset_factory(parent_model, model, form=ModelForm, |
696 | 697 | formset=BaseInlineFormSet, fk_name=None, |
697 | | fields=None, exclude=None, |
| 698 | fields=None, exclude=None, classes=[], |
698 | 699 | extra=3, can_order=False, can_delete=True, max_num=0, |
699 | 700 | formfield_callback=lambda f: f.formfield()): |
700 | 701 | """ |
… |
… |
def inlineformset_factory(parent_model, model, form=ModelForm,
|
717 | 718 | 'fields': fields, |
718 | 719 | 'exclude': exclude, |
719 | 720 | 'max_num': max_num, |
| 721 | 'classes': classes, |
720 | 722 | } |
721 | 723 | FormSet = modelformset_factory(model, **kwargs) |
722 | 724 | FormSet.fk = fk |
diff --git a/docs/ref/contrib/admin/index.txt b/docs/ref/contrib/admin/index.txt
index 700303f..99d7918 100644
a
|
b
|
An override to the ``verbose_name`` found in the model's inner ``Meta`` class.
|
915 | 915 | An override to the ``verbose_name_plural`` found in the model's inner ``Meta`` |
916 | 916 | class. |
917 | 917 | |
| 918 | ``classes`` |
| 919 | ~~~~~~~~~~~ |
| 920 | |
| 921 | .. versionadded:: development |
| 922 | |
| 923 | A list containing extra CSS classes to apply to the inline. |
| 924 | |
| 925 | Example:: |
| 926 | |
| 927 | class BookInline(admin.TabularInline): |
| 928 | classes = ['collapse', 'extrapretty'] |
| 929 | |
| 930 | A useful class is ``collapse``, which will cause the inline to be initially |
| 931 | collapsed. |
| 932 | |
918 | 933 | Working with a model with two or more foreign keys to the same parent model |
919 | 934 | --------------------------------------------------------------------------- |
920 | 935 | |