Opened 15 years ago

Last modified 15 years ago

#10075 closed

model inheritance with foreign key problem — at Version 1

Reported by: marcominutoli@… Owned by: nobody
Component: Forms Version: 1.0
Severity: Keywords: model inheritance foreign key
Cc: raffaele.salmaso@… Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description (last modified by Ramiro Morales)

I have these three models:

class Address(models.Model):
   name = models.CharField(max_length=100)
   ## many other fields ##

   class Meta:
       ordering = ('name',)

   def __unicode__(self):
       return self.name


class Organization(models.Model):
   name = models.CharField(max_length=100)
   ## many other fields ##

   class Meta:
       ordering = ('name',)

   def __unicode__(self):
       return self.name


class OrganizationAddress(Address):
   organization = models.ForeignKey (
       Organization,
       related_name = "addresses",
   )

When i try to add/edit an organization and add one address i've got this error:

      " ValueError: Cannot assign None: "OrganizationAddress.address_ptr" does not allow null values. "

I've tried to understand the problem (because it happened since one day to another..) and i've found that the problem was born after the django commit of the changeset [9664]

This is the "incriminated code" of changeset:

	488	        if fk_attname == self._pk_field.attname: 
 	489	            exclude =  [self._pk_field.name] 
 	490	        else: 
 	491	            exclude = []

I have "organization_id" in the fk_attname e "address_ptr" in the self._pk_field.attname and so the primary_key wasn't insert in the exclude list.

Below a code portion to test the problem.

from django.forms.models import inlineformset_factory
from my_apps.models import Organization, Address, OrganizationAddress

Organization(name='test').save()
org = Organization.objects.get(name='test')

inline_formset = inlineformset_factory(Organization, OrganizationAddress, can_delete=False, extra=2)

data = {
   'addresses-TOTAL_FORMS': '2', # the number of forms rendered
   'addresses-INITIAL_FORMS': '0', # the number of forms with initial data
   'addresses-0-name': 'Test test',
}

formset = inline_formset(data, instance=org)

formset.is_valid()
formset.save()

Sorry for my english.
Marco M.

Change History (1)

comment:1 by Ramiro Morales, 15 years ago

Description: modified (diff)

(edited description, please please use the 'Preview' button when submitting a ticket)

Note: See TracTickets for help on using tickets.
Back to Top