Форматирование строки Python, возвращающее свойство вместо строки (Unicode)? - PullRequest
3 голосов
/ 09 марта 2012

Я получаю сообщение об ошибке в Django, говорящее Caught TypeError while rendering: sequence item 1: expected string or Unicode, Property found.Вот мой код:

def __unicode__( self ) :
    return "{} : {}".format( self.name, self.location )

Я даже пытался

def __unicode__( self ) :
    return unicode( "{} : {}".format( self.name, self.location ) )

, но та же ошибка.

Из того, что я знаю "this is x = {}".format( x ) возвращает строку правильно?Почему Python говорит, что это свойство?

Полный код:

class Item( models.Model ) :
    def __unicode__( self ) :
        return "{} : {}".format( self.name, self.location )

    name       = models.CharField( max_length = 135 )
    comment    = models.TextField( blank = True )
    item_type  = models.ForeignKey( ItemType )
    location   = models.ForeignKey( Location )
    t_created  = models.DateTimeField( auto_now_add = True, verbose_name = 'created' )
    t_modified = models.DateTimeField( auto_now = True, verbose_name = 'modified' )

class Location( models.Model ) :
    def __unicode__( self ) :
        locations = filter( None, [ self.room, self.floor, self.building ] )
        locations.append( self.prop )

        return ", ".join( locations ) # This will look in the form of like "room, floor, building, property"

    comment    = models.TextField( blank = True )
    room       = models.CharField( max_length = 135, blank = True )
    floor      = models.CharField( max_length = 135, blank = True )
    building   = models.CharField( max_length = 135, blank = True )
    prop       = models.ForeignKey( Property )
    t_created  = models.DateTimeField( auto_now_add = True, verbose_name = 'created' )
    t_modified = models.DateTimeField( auto_now = True, verbose_name = 'modified' )

class Property( models.Model ) :
    def __unicode__( self ) :
        return self.name

    name = models.CharField( max_length = 135 )

Ответы [ 2 ]

1 голос
/ 09 марта 2012

Property относится не к свойству Python, а к вашему Property классу. Вероятно, происходит следующее:

  1. Item.__unicode__ вызывается.
  2. Хватает self.name и self.location.
  3. self.name возвращает строку юникода из метода __unicode__.
  4. self.location - это внешний ключ, поэтому вызывается Location.__unicode__.
  5. Это получает self.room, self.floor и self.building, у всех из которых есть __unicode__ методы, которые возвращают строки Unicode.
  6. filter видит, что все эти строки пусты, поэтому locations имеет значение [].
  7. self.prop, то есть Property, добавляется к locations.
  8. ", ".join( locations ) Выдает TypeError, потому что Property не является строкой.
  9. вызов str.format в Item.__unicode__ перехватывает это исключение и выдает его, что вы и видите.

Решение: изменить

locations.append( self.prop )

до

locations.append( unicode(self.prop) )

Мораль: str.format вызывает str() на свои аргументы, но str.join нет.

0 голосов
/ 09 марта 2012

Вы пробовали?:

def __unicode__( self ):
    return "{name}: {location}".format(name=self.name, location=self.location)

или

def __unicode__( self ):
    return "{0}: {1}".format(self.name, self.location)

или

def __unicode__( self ):
    return "%s: %s" % (self.name, self.location)

Надеюсь, это поможет:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...