summaryrefslogtreecommitdiff
path: root/django
diff options
context:
space:
mode:
authorRussell Keith-Magee <russell@keith-magee.com>2009-03-10 11:19:26 +0000
committerRussell Keith-Magee <russell@keith-magee.com>2009-03-10 11:19:26 +0000
commit3c8568a7dcb38aaa5aceec4f20c3ec3f0217a50d (patch)
treeda5850b07016cc78087b5769e03d3040721a513d /django
parentd0fff8ccd4d61a848314ada5b386652606d44f00 (diff)
Fixed #10271, #10281 -- Fixed the handling multiple inline models that share a common base class and have the link to the inline parent on the base class. Includes modifications that allow the equivalent handling for GenericFields. Thanks to Idan Gazit, Antti Kaihola (akaihola), and Alex Gaynor for their work on this patch.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@10017 bcc190cf-cafb-0310-a4f2-bffc1f526a37
Diffstat (limited to 'django')
-rw-r--r--django/contrib/admin/options.py29
-rw-r--r--django/contrib/contenttypes/generic.py12
-rw-r--r--django/forms/formsets.py13
-rw-r--r--django/forms/models.py12
4 files changed, 53 insertions, 13 deletions
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index ed41c7ff64..859229e430 100644
--- a/django/contrib/admin/options.py
+++ b/django/contrib/admin/options.py
@@ -522,10 +522,16 @@ class ModelAdmin(BaseModelAdmin):
else:
form_validated = False
new_object = self.model()
+ prefixes = {}
for FormSet in self.get_formsets(request):
+ prefix = FormSet.get_default_prefix()
+ prefixes[prefix] = prefixes.get(prefix, 0) + 1
+ if prefixes[prefix] != 1:
+ prefix = "%s-%s" % (prefix, prefixes[prefix])
formset = FormSet(data=request.POST, files=request.FILES,
instance=new_object,
- save_as_new=request.POST.has_key("_saveasnew"))
+ save_as_new=request.POST.has_key("_saveasnew"),
+ prefix=prefix)
formsets.append(formset)
if all_valid(formsets) and form_validated:
self.save_model(request, new_object, form, change=False)
@@ -547,8 +553,13 @@ class ModelAdmin(BaseModelAdmin):
if isinstance(f, models.ManyToManyField):
initial[k] = initial[k].split(",")
form = ModelForm(initial=initial)
+ prefixes = {}
for FormSet in self.get_formsets(request):
- formset = FormSet(instance=self.model())
+ prefix = FormSet.get_default_prefix()
+ prefixes[prefix] = prefixes.get(prefix, 0) + 1
+ if prefixes[prefix] != 1:
+ prefix = "%s-%s" % (prefix, prefixes[prefix])
+ formset = FormSet(instance=self.model(), prefix=prefix)
formsets.append(formset)
adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields)
@@ -608,9 +619,14 @@ class ModelAdmin(BaseModelAdmin):
else:
form_validated = False
new_object = obj
+ prefixes = {}
for FormSet in self.get_formsets(request, new_object):
+ prefix = FormSet.get_default_prefix()
+ prefixes[prefix] = prefixes.get(prefix, 0) + 1
+ if prefixes[prefix] != 1:
+ prefix = "%s-%s" % (prefix, prefixes[prefix])
formset = FormSet(request.POST, request.FILES,
- instance=new_object)
+ instance=new_object, prefix=prefix)
formsets.append(formset)
if all_valid(formsets) and form_validated:
@@ -625,8 +641,13 @@ class ModelAdmin(BaseModelAdmin):
else:
form = ModelForm(instance=obj)
+ prefixes = {}
for FormSet in self.get_formsets(request, obj):
- formset = FormSet(instance=obj)
+ prefix = FormSet.get_default_prefix()
+ prefixes[prefix] = prefixes.get(prefix, 0) + 1
+ if prefixes[prefix] != 1:
+ prefix = "%s-%s" % (prefix, prefixes[prefix])
+ formset = FormSet(instance=obj, prefix=prefix)
formsets.append(formset)
adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields)
diff --git a/django/contrib/contenttypes/generic.py b/django/contrib/contenttypes/generic.py
index 13e7cd7a39..8dd735d15e 100644
--- a/django/contrib/contenttypes/generic.py
+++ b/django/contrib/contenttypes/generic.py
@@ -291,7 +291,7 @@ class BaseGenericInlineFormSet(BaseModelFormSet):
ct_field_name = "content_type"
ct_fk_field_name = "object_id"
- def __init__(self, data=None, files=None, instance=None, save_as_new=None):
+ def __init__(self, data=None, files=None, instance=None, save_as_new=None, prefix=None):
opts = self.model._meta
self.instance = instance
self.rel_name = '-'.join((
@@ -300,9 +300,17 @@ class BaseGenericInlineFormSet(BaseModelFormSet):
))
super(BaseGenericInlineFormSet, self).__init__(
queryset=self.get_queryset(), data=data, files=files,
- prefix=self.rel_name
+ prefix=prefix
)
+ #@classmethod
+ def get_default_prefix(cls):
+ opts = cls.model._meta
+ return '-'.join((opts.app_label, opts.object_name.lower(),
+ cls.ct_field.name, cls.ct_fk_field.name,
+ ))
+ get_default_prefix = classmethod(get_default_prefix)
+
def get_queryset(self):
# Avoid a circular import.
from django.contrib.contenttypes.models import ContentType
diff --git a/django/forms/formsets.py b/django/forms/formsets.py
index 887f130347..10306c7e6d 100644
--- a/django/forms/formsets.py
+++ b/django/forms/formsets.py
@@ -32,7 +32,7 @@ class BaseFormSet(StrAndUnicode):
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
initial=None, error_class=ErrorList):
self.is_bound = data is not None or files is not None
- self.prefix = prefix or 'form'
+ self.prefix = prefix or self.get_default_prefix()
self.auto_id = auto_id
self.data = data
self.files = files
@@ -62,7 +62,7 @@ class BaseFormSet(StrAndUnicode):
initial = {TOTAL_FORM_COUNT: self._total_form_count,
INITIAL_FORM_COUNT: self._initial_form_count}
self.management_form = ManagementForm(initial=initial, auto_id=self.auto_id, prefix=self.prefix)
-
+
# construct the forms in the formset
self._construct_forms()
@@ -74,7 +74,7 @@ class BaseFormSet(StrAndUnicode):
self.forms = []
for i in xrange(self._total_form_count):
self.forms.append(self._construct_form(i))
-
+
def _construct_form(self, i, **kwargs):
"""
Instantiates and returns the i-th form instance in a formset.
@@ -118,7 +118,7 @@ class BaseFormSet(StrAndUnicode):
def _get_deleted_forms(self):
"""
- Returns a list of forms that have been marked for deletion. Raises an
+ Returns a list of forms that have been marked for deletion. Raises an
AttributeError if deletion is not allowed.
"""
if not self.is_valid() or not self.can_delete:
@@ -176,6 +176,11 @@ class BaseFormSet(StrAndUnicode):
return [self.forms[i[0]] for i in self._ordering]
ordered_forms = property(_get_ordered_forms)
+ #@classmethod
+ def get_default_prefix(cls):
+ return 'form'
+ get_default_prefix = classmethod(get_default_prefix)
+
def non_form_errors(self):
"""
Returns an ErrorList of errors that aren't associated with a particular
diff --git a/django/forms/models.py b/django/forms/models.py
index e6bbb98718..bfc0b35803 100644
--- a/django/forms/models.py
+++ b/django/forms/models.py
@@ -249,8 +249,8 @@ class BaseModelForm(BaseForm):
# This is an extra field that's not on the ModelForm, ignore it
continue
if not isinstance(f, ModelField):
- # This is an extra field that happens to have a name that matches,
- # for example, a related object accessor for this model. So
+ # This is an extra field that happens to have a name that matches,
+ # for example, a related object accessor for this model. So
# get_field_by_name found it, but it is not a Field so do not proceed
# to use it as if it were.
continue
@@ -472,7 +472,7 @@ class BaseInlineFormSet(BaseModelFormSet):
# is there a better way to get the object descriptor?
self.rel_name = RelatedObject(self.fk.rel.to, self.model, self.fk).get_accessor_name()
qs = self.model._default_manager.filter(**{self.fk.name: self.instance})
- super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix or self.rel_name,
+ super(BaseInlineFormSet, self).__init__(data, files, prefix=prefix,
queryset=qs)
def _construct_forms(self):
@@ -489,6 +489,12 @@ class BaseInlineFormSet(BaseModelFormSet):
form.data[form.add_prefix(self._pk_field.name)] = None
return form
+ #@classmethod
+ def get_default_prefix(cls):
+ from django.db.models.fields.related import RelatedObject
+ return RelatedObject(cls.fk.rel.to, cls.model, cls.fk).get_accessor_name()
+ get_default_prefix = classmethod(get_default_prefix)
+
def save_new(self, form, commit=True):
fk_attname = self.fk.get_attname()
kwargs = {fk_attname: self.instance.pk}