毎回モデルに__unicode__定義するのめんどい

クラスデコレータとかで何とかならないかな?

def inspectable(klass):
    field_names = [field.get_attname() for field in klass._meta.fields]
    def _inspect(self):
        results = []
        results.append('%s object' % self.__class__.__name__)
        for name in field_names:
            text = "  %s: %s" % (name, self.__getattribute__(name))
            results.append(text)
        return "\n".join(results)
    setattr(klass, "__str__", _inspect)
    return klass

@inspectable
class Book(models.Model):
    title = models.CharField(max_length=255)
    author = models.CharField(default="anonymous")
    publish_at = models.DateField(auto_now_add=True)

unicodeまわりが良く分かっていない。

  • __str__を作るか、__unicode__を作るか。
  • 中にdecode("utf-8")みたいな処理が必要か。

追記

こうかも

def inspectable(klass):
    field_names = [field.get_attname() for field in klass._meta.fields]
    def _inspect(self):
        results = []
        results.append('%s object' % self.__class__.__name__)
        for name in field_names:
            text = "  %s: %s" % (name, self.__getattribute__(name))
            results.append(text)
        return unicode("\n".join(results))
    setattr(klass, "__unicode__", _inspect)
    return klass