#12577: New validation behaviour breaks django.contrib.contenttypes when
unique_toghether is used
----------------------------------------+-----------------------------------
 Reporter:  [email protected]  |       Owner:  nobody    
   Status:  new                         |   Milestone:            
Component:  Uncategorized               |     Version:  SVN       
 Keywords:                              |       Stage:  Unreviewed
Has_patch:  0                           |  
----------------------------------------+-----------------------------------
 The behaviour introduced with modelvalidation breaks the generic content
 type framework

 This is the simplest code used to reproduce the bug
 {{{
 # models.py
 class PhoneNumber(models.Model):
     content_type = models.ForeignKey(ContentType)
     object_id = models.PositiveIntegerField()
     content_object = generic.GenericForeignKey('content_type',
 'object_id')
     phone = models.CharField(max_length=30)

     class Meta:
         unique_together = (('content_type', 'object_id', 'phone',),)

     def __unicode__(self):
         return self.phone

 class Contact(models.Model):
     name = models.CharField(max_length=50)
     phones = generic.GenericRelation(PhoneNumber)

     def __unicode__(self):
         return self.name

 # admin.py
 class PhoneInline(GenericTabularInline):
     model = PhoneNumber
     extra = 1
 class ContactAdmin(admin.ModelAdmin):
     inlines = (PhoneInline,)
 admin.site.register(Contact, ContactAdmin)
 }}}

 Now trying to save a contact instance with a phone number via the admin
 interface, results a 404 KeyError

 {{{
 Environment:

 Request Method: POST
 Request URL: http://localhost:8000/admin/example/genericcontact/1/
 Django Version: 1.2 alpha 1
 Python Version: 2.6.4
 Installed Applications:
 ['django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.sessions',
  'django.contrib.sites',
  'django.contrib.admin',
  'django.contrib.comments',
  'example']
 Installed Middleware:
 ('django.middleware.gzip.GZipMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.locale.LocaleMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.middleware.doc.XViewMiddleware',
  'django.middleware.transaction.TransactionMiddleware')


 Traceback:
 File "/home/raf/src/www/simple/site-
 packages/django/django/core/handlers/base.py" in get_response
   101.                     response = callback(request, *callback_args,
 **callback_kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/contrib/admin/options.py" in wrapper
   237.                 return self.admin_site.admin_view(view)(*args,
 **kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/utils/decorators.py" in __call__
   36.         return self.decorator(self.func)(*args, **kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/utils/decorators.py" in _wrapped_view
   86.                     response = view_func(request, *args, **kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/utils/decorators.py" in __call__
   36.         return self.decorator(self.func)(*args, **kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/views/decorators/cache.py" in _wrapped_view_func
   70.         response = view_func(request, *args, **kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/contrib/admin/sites.py" in inner
   187.             return view(request, *args, **kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/utils/decorators.py" in _wrapped_view
   86.                     response = view_func(request, *args, **kwargs)
 File "/home/raf/src/www/simple/site-
 packages/django/django/db/transaction.py" in _commit_on_success
   295.                     res = func(*args, **kw)
 File "/home/raf/src/www/simple/site-
 packages/django/django/contrib/admin/options.py" in change_view
   883.             if all_valid(formsets) and form_validated:
 File "/home/raf/src/www/simple/site-
 packages/django/django/forms/formsets.py" in all_valid
   317.         if not formset.is_valid():
 File "/home/raf/src/www/simple/site-
 packages/django/django/forms/formsets.py" in is_valid
   238.             if bool(self.errors[i]):
 File "/home/raf/src/www/simple/site-
 packages/django/django/forms/formsets.py" in _get_errors
   212.             self.full_clean()
 File "/home/raf/src/www/simple/site-
 packages/django/django/forms/formsets.py" in full_clean
   254.             self.clean()
 File "/home/raf/src/www/simple/site-
 packages/django/django/forms/models.py" in clean
   412.         self.validate_unique()
 File "/home/raf/src/www/simple/site-
 packages/django/django/forms/models.py" in validate_unique
   435.                     row_data = tuple([form.cleaned_data[field] for
 field in unique_check])

 Exception Type: KeyError at /admin/example/genericcontact/1/
 Exception Value: content_type
 }}}

-- 
Ticket URL: <http://code.djangoproject.com/ticket/12577>
Django <http://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.
-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/django-updates?hl=en.


Reply via email to