#8569: Admin fieldsets can cause "'str' object has no attribute
'_default_manager'' under mod_wsgi
---------------------------+------------------------------------------------
 Reporter:  kmtracey       |       Owner:  nobody    
   Status:  new            |   Milestone:  1.0       
Component:  Uncategorized  |     Version:  SVN       
 Keywords:                 |       Stage:  Unreviewed
Has_patch:  0              |  
---------------------------+------------------------------------------------
 As reported here: http://groups.google.com/group/django-
 users/browse_thread/thread/da39ac4b1e5c1751# (and earlier but never
 recreated/isolated), under some circumstances a fieldsets definition in a
 !ModelAdmin definition can cause the exception:

 'str' object has no attribute '_default_manager'

 Today's poster isolated the problem to mod_wsgi, and I was able to
 recreate with an example project he sent to me.  There are two apps:
 catalogue and simplepromo (listed in that order in INSTALLED_APPS,
 reversing them didn't change anything).  catalogue has a single model in
 models.py:

 {{{
 class Maker(models.Model):
     dummy = models.CharField(blank=True, max_length=80)

     def __unicode__(self):
         return self.dummy
 }}}

 simplepromo (a simplified version of what Maciek sent me), also has a
 single model in models.py:

 {{{
 class SimplePromo(models.Model):

     name = models.CharField(blank=False, max_length=250,
 help_text="Displayed in overlay tooltip")
     slug = models.SlugField()
     promo_maker = models.ForeignKey("catalogue.Maker", null=True,
 blank=False)
     def __unicode__(self):
         return self.name
 }}}

 and an admin.py file:

 {{{
 from django.contrib import admin
 from simplepromo.models import *
 class SimplePromoAdmin(admin.ModelAdmin):
     prepopulated_fields = {'slug': ('name',)}

     fieldsets = (
         ("Base", {
             "fields": ["name","slug","promo_maker",],
         }),
     )

 admin.site.register(SimplePromo, SimplePromoAdmin)
 }}}

 The call to admin.autodiscover() in urls.py is what generates the
 exception.  If I remove the catch/transform to !ImproperlyConfigured done
 by urlresolvers.py (ref #7524) I can get the actual traceback:

 {{{
 Environment:

 Request Method: GET
 Request URL: http://localhost/admin/
 Django Version: 1.0-beta_1-SVN-8582
 Python Version: 2.5.2
 Installed Applications:
 ['django.contrib.admin',
  'django.contrib.auth',
  'django.contrib.contenttypes',
  'django.contrib.humanize',
  'django.contrib.markup',
  'django.contrib.sessions',
  'django.contrib.sites',
  'catalogue',
  'simplepromo']
 Installed Middleware:
 ('django.middleware.common.CommonMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.contrib.auth.middleware.AuthenticationMiddleware',
  'django.middleware.doc.XViewMiddleware')


 Traceback:
 File "c:\u\kmt\django\trunk\django\core\handlers\base.py" in get_response
   77.                     request.path_info)
 File "c:/u/kmt/django/trunk\django\core\urlresolvers.py" in resolve
   238.             for pattern in self.urlconf_module.urlpatterns:
 File "c:/u/kmt/django/trunk\django\core\urlresolvers.py" in
 _get_urlconf_module
   257.              self._urlconf_module = __import__(self.urlconf_name,
 {}, {}, [''])
 File "c:/u/kmt/software/web/ppi-test\urls.py" in <module>
   9. admin.autodiscover()
 File "c:\u\kmt\django\trunk\django\contrib\admin\__init__.py" in
 autodiscover
   19.         __import__("%s.admin" % app)
 File "c:/u/kmt/software/web/ppi-test\simplepromo\admin.py" in <module>
   12. admin.site.register(SimplePromo, SimplePromoAdmin)
 File "c:\u\kmt\django\trunk\django\contrib\admin\sites.py" in register
   91.             validate(admin_class, model)
 File "c:\u\kmt\django\trunk\django\contrib\admin\validation.py" in
 validate
   19.     _validate_base(cls, model)
 File "c:\u\kmt\django\trunk\django\contrib\admin\validation.py" in
 _validate_base
   201.             _check_form_field_existsw("fieldsets[%d][1]['fields']"
 % idx, field)
 File "c:\u\kmt\django\trunk\django\contrib\admin\validation.py" in
 _check_form_field_existsw
   162.         return _check_form_field_exists(cls, model, opts, label,
 field)
 File "c:\u\kmt\django\trunk\django\contrib\admin\validation.py" in
 _check_form_field_exists
   282.         fields = fields_for_model(model)
 File "c:\u\kmt\django\trunk\django\forms\models.py" in fields_for_model
   145.         formfield = formfield_callback(f)
 File "c:\u\kmt\django\trunk\django\forms\models.py" in <lambda>
   124. def fields_for_model(model, fields=None, exclude=None,
 formfield_callback=lambda f: f.formfield()):
 File "c:\u\kmt\django\trunk\django\db\models\fields\related.py" in
 formfield
   726.         defaults = {'form_class': forms.ModelChoiceField,
 'queryset':
 self.rel.to._default_manager.complex_filter(self.rel.limit_choices_to)}

 Exception Type: AttributeError at /admin/
 Exception Value: 'str' object has no attribute '_default_manager'
 }}}

 I added a couple of local variables so I could see what's what and the
 local vars in that last routine are:

 {{{
 kwargs  {}
 self  <django.db.models.fields.related.ForeignKey object at 0x01EC8390>
 self_rel <django.db.models.fields.related.ManyToOneRel object at
 0x01EC83B0>
 self_rel_to 'catalogue.Maker'
 }}}

 Running the exact same app code under the development server plus putting
 a stop exception where the exception is generated under wsgi, I can see
 the local vars are different when running under the dev server:

 {{{
 kwargs  {}
 self  <django.db.models.fields.related.ForeignKey object at 0x01067BB0>
 self_rel  <django.db.models.fields.related.ManyToOneRel object at
 0x01067BD0>
 self_rel_to  <class 'catalogue.models.Maker'>
 }}}

 So somehow when running under the dev server (and anything other than
 wsgi, according to Maciek) self.rel.to has been transformed from a string
 to an actual class reference before this code is called.  I haven't a clue
 how this happens or why it isn't happening when running under mod_wsgi, so
 that's about as far as I can go with this one.  Hopefully someone else can
 shed some light?

-- 
Ticket URL: <http://code.djangoproject.com/ticket/8569>
Django Code <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