Skip to content

Commit 4ea7168

Browse files
Merge pull request #110 from fbuccioni/master
Fix: Factories and changelists for list_editable admin
2 parents ad7feca + 45c7845 commit 4ea7168

File tree

2 files changed

+48
-14
lines changed

2 files changed

+48
-14
lines changed

django_mongoengine/forms/documents.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -218,8 +218,15 @@ def save(self, commit=True):
218218
class DocumentForm(BaseDocumentForm):
219219
pass
220220

221-
222-
documentform_factory = partial(model_forms.modelform_factory, form=DocumentForm)
221+
def documentform_factory(
222+
model, form=DocumentForm, fields=None, exclude=None, formfield_callback=None,
223+
widgets=None, localized_fields=None, labels=None, help_texts=None,
224+
error_messages=None, *args, **kwargs
225+
):
226+
return model_forms.modelform_factory(
227+
model, form, fields, exclude, formfield_callback, widgets, localized_fields,
228+
labels, help_texts, error_messages, *args, **kwargs
229+
)
223230

224231

225232
@six.add_metaclass(DocumentFormMetaclass)
@@ -259,11 +266,18 @@ class BaseDocumentFormSet(model_forms.BaseModelFormSet):
259266
A ``FormSet`` for editing a queryset and/or adding new objects to it.
260267
"""
261268

262-
263-
documentformset_factory = partial(
264-
model_forms.modelformset_factory,
265-
form=DocumentForm, formset=BaseDocumentFormSet,
266-
)
269+
def documentformset_factory(
270+
model, form=DocumentForm, formfield_callback=None, formset=BaseDocumentFormSet,
271+
extra=1, can_delete=False, can_order=False, max_num=None, fields=None,
272+
exclude=None, widgets=None, validate_max=False, localized_fields=None,
273+
labels=None, help_texts=None, error_messages=None, min_num=None,
274+
validate_min=False, *args, **kwargs
275+
):
276+
return model_forms.modelformset_factory(
277+
model, form, formfield_callback, formset, extra, can_delete, can_order,
278+
max_num, fields, exclude, widgets, validate_max, localized_fields, labels,
279+
help_texts, error_messages, min_num, validate_min, *args, **kwargs
280+
)
267281

268282

269283
class BaseInlineDocumentFormSet(BaseDocumentFormSet):

django_mongoengine/mongo_admin/options.py

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import operator
2-
from functools import reduce
2+
from functools import reduce, partial
33

44
from django import forms
55
from django.forms.formsets import all_valid
@@ -26,6 +26,7 @@
2626
from django.utils.text import capfirst
2727
from django.utils.translation import ugettext as _
2828
from django.forms.forms import pretty_name
29+
from django.forms.models import modelform_defines_fields
2930
from django.conf import settings
3031
from django.apps import apps
3132

@@ -40,7 +41,7 @@
4041
from django_mongoengine.utils.wrappers import copy_class
4142
from django_mongoengine.utils.monkey import get_patched_django_module
4243
from django_mongoengine.forms.documents import (
43-
DocumentForm,
44+
DocumentForm, documentform_factory, documentformset_factory,
4445
inlineformset_factory, BaseInlineDocumentFormSet)
4546

4647

@@ -53,7 +54,6 @@ def get_content_type_for_model(obj):
5354
get_content_type_for_model=get_content_type_for_model,
5455
)
5556

56-
5757
class BaseDocumentAdmin(djmod.BaseModelAdmin):
5858
"""Functionality common to both ModelAdmin and InlineAdmin."""
5959
form = DocumentForm
@@ -205,12 +205,32 @@ def _get_inline_instances(self):
205205
self.inline_instances.append(inline_instance)
206206

207207
def get_changelist_form(self, request, **kwargs):
208-
kwargs.setdefault("form", DocumentForm)
209-
return super(DocumentAdmin, self).get_changelist_form(request, **kwargs)
208+
"""
209+
Returns a Form class for use in the Formset on the changelist page.
210+
"""
211+
defaults = {
212+
"formfield_callback": partial(self.formfield_for_dbfield, request=request),
213+
}
214+
defaults.update(kwargs)
215+
if defaults.get('fields') is None and not modelform_defines_fields(defaults.get('form')):
216+
defaults['fields'] = forms.ALL_FIELDS
217+
218+
return documentform_factory(self.model, **defaults)
210219

211220
def get_changelist_formset(self, request, **kwargs):
212-
kwargs.setdefault("form", DocumentForm)
213-
return super(DocumentAdmin, self).get_changelist_formset(request, **kwargs)
221+
"""
222+
Returns a FormSet class for use on the changelist page if list_editable
223+
is used.
224+
"""
225+
defaults = {
226+
"formfield_callback": partial(self.formfield_for_dbfield, request=request),
227+
}
228+
defaults.update(kwargs)
229+
return documentformset_factory(
230+
self.model, self.get_changelist_form(request), extra=0,
231+
fields=self.list_editable, **defaults
232+
)
233+
214234

215235
def log_addition(self, request, object, message):
216236
"""

0 commit comments

Comments
 (0)