Added AttributeInlineFormSet to force new Attribute instances to be run through the...
authorStephen Burrows <stephen.r.burrows@gmail.com>
Thu, 14 Oct 2010 16:29:17 +0000 (12:29 -0400)
committerStephen Burrows <stephen.r.burrows@gmail.com>
Thu, 14 Oct 2010 16:29:17 +0000 (12:29 -0400)
admin/base.py
forms.py

index a39756a..f4a5f2f 100644 (file)
@@ -1,7 +1,7 @@
 from django.contrib import admin
 from django.contrib.contenttypes import generic
 from philo.models import Tag, Attribute
-from philo.forms import AttributeForm
+from philo.forms import AttributeForm, AttributeInlineFormSet
 
 
 COLLAPSE_CLASSES = ('collapse', 'collapse-closed', 'closed',)
@@ -16,6 +16,7 @@ class AttributeInline(generic.GenericTabularInline):
        allow_add = True
        classes = COLLAPSE_CLASSES
        form = AttributeForm
+       formset = AttributeInlineFormSet
        exclude = ['value_object_id']
 
 
index 69273f0..48e1d7f 100644 (file)
--- a/forms.py
+++ b/forms.py
@@ -1,5 +1,7 @@
 from django import forms
 from django.contrib.admin.widgets import AdminTextareaWidget
+from django.contrib.contenttypes.generic import BaseGenericInlineFormSet
+from django.contrib.contenttypes.models import ContentType
 from django.core.exceptions import ValidationError, ObjectDoesNotExist
 from django.db.models import Q
 from django.forms.models import model_to_dict, fields_for_model, ModelFormMetaclass, ModelForm, BaseInlineFormSet
@@ -150,6 +152,14 @@ class AttributeForm(ModelForm):
                model = Attribute
 
 
+class AttributeInlineFormSet(BaseGenericInlineFormSet):
+       "Necessary to force the GenericInlineFormset to use the form's save method for new objects."
+       def save_new(self, form, commit):
+               setattr(form.instance, self.ct_field.get_attname(), ContentType.objects.get_for_model(self.instance).pk)
+               setattr(form.instance, self.ct_fk_field.get_attname(), self.instance.pk)
+               return form.save()
+
+
 class ContainerForm(ModelForm):
        def __init__(self, *args, **kwargs):
                super(ContainerForm, self).__init__(*args, **kwargs)