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 | |