Opened 11 years ago

Closed 11 years ago

#20374 closed Bug (invalid)

When saving a form in Admin with an Inline, I get 'not subscriptable' error

Reported by: evlsin@… Owned by: nobody
Component: contrib.admin Version: 1.5
Severity: Normal Keywords:
Cc: Triage Stage: Unreviewed
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

When I try to save in the admin, I get:

TypeError: 'MyModelName' object is not subscriptable

affected line is: e = self.model(None, None, user_id, content_type_id, smart_text(object_id), object_repr[:200], action_flag, change_message)

I dropped back down to Django 1.4.5 and the form works just fine now

admin.py:

class CountryNameInline(admin.TabularInline):
    model = GlobalCountriesNames
    extra = 1

class CountryAdmin(admin.ModelAdmin):
    list_display = ('countrycode', 'country_name', 'primary_lang_id', 'active')
    list_display_links = ('countrycode', 'country_name')
    inlines = [CountryNameInline, ]

models.py:

class GlobalLanguages(models.Model):
    lang_id = models.CharField(max_length=2,
                               primary_key=True,
                               verbose_name=_('Language ID'),
                               help_text=_('ISO 639-1 2 letter language code - see: <a href="http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes" target=_blank>http://en.wikipedia.org/wiki/List_of_ISO_639-1_codes</a>'))
    lang_name = models.CharField(max_length=30,
                                 verbose_name=_('Language Name'),
                                 help_text=_('Use the language name in it\'s native language'))
    active = models.BooleanField(default=True,
                                 verbose_name=_('Active'),
                                 db_column='is_active')
    created = models.DateTimeField(auto_now_add=True,
                                   editable=False)
    modified = models.DateTimeField(auto_now=True,
                                    editable=False)

    def __unicode__(self):
        return self.lang_name

    class Meta:
        verbose_name = _('Language')
        verbose_name_plural = _('Languages')
        permissions = (('can_add_edit_languages', _('Can Add or Edit Languages')))

class GlobalCountries(models.Model):
    countrycode = models.CharField(max_length=2,
                                   primary_key=True,
                                   verbose_name=_('Country Code'))
    primary_lang_id = models.ForeignKey(GlobalLanguages)
    active = models.BooleanField(default=True,
                                 verbose_name=_('Active'),
                                 db_column='is_active')
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    class Meta:
        verbose_name = _('Country')
        verbose_name_plural = _('Countries')
        permissions = (('can_add_edit_countries', _('Can Add or Edit Countries')))

    def _get_country_name(self):
        cur_lang = get_language()
        countryname = GlobalCountriesNames.objects.get(country_id=self.countrycode,
                                                        lang_id=cur_lang)
        if countryname is None:
            countryname = GlobalCountriesNames.objects.get(country_id=self.countrycode,
                                                            lang_id='en')
        return unicode(countryname)

    country_name = property(_get_country_name)

    def __unicode__(self):
        return self.country_name


class GlobalCountriesNames(models.Model):
    country_id = models.ForeignKey(GlobalCountries,
                                   verbose_name=_('Country'))
    lang_id = models.ForeignKey(GlobalLanguages,
                                verbose_name=_('Language'))
    country_name = models.CharField(max_length=120,
                                   verbose_name=_('Country Name'))
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.country_name

    class Meta:
        verbose_name = _('Country Name')
        verbose_name_plural = _('Country Names')
        unique_together = ('country_id', 'lang_id')

Change History (1)

comment:1 by Baptiste Mispelon, 11 years ago

Resolution: invalid
Status: newclosed

Hi,

I cannot reproduce your issue (I tried with both version 1.5 and the latest one).

The problem you describe seems to arrise when creating a LogEntry object corresponding to the creation of your model.
The error message indicates that your model's __unicode__ method returned an instance of MyModelName rather than the expected unicode string, which is not consistent with the code you pasted.

In consequence, I'm marking this issue as invalid. Please re-open it and provide:

  • The full error traceback
  • The actual code that triggers the error (the more you can simplify this code, the easier it is for someone to review this ticket)

Thanks.

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