タイトルのないコンテンツタイプを作る

 タイトルのないコンテンツタイプといえば、Title-less Typeに書かれた方法が有名ですが、もっと簡単な方法がありました。


やることは次の2つです。

  • スキーマからTitleを削除する。
  • コンテンツのクラスにTitleメソッドを用意する。

スキーマからTitleを削除する。

 スキーマ定義の最後のところで、titleフィールドを削除します。

# 通常のスキーマ定義を行った上で…
MyContentSchema = BaseSchema.copy.copy() + atapi.Schema((
    # -*- Your Archetypes field definitions here ... -*-
    atapi.StringField('version',
        default = 'A',
        widget = atapi.StringWidget(label = _(u'Version')),
               ),
    ・・・
))

#titleフィールドを削除します。
del MyContentSchema ['title']

スキーマから削除されていますので、当然ながら画面上にTitleフィールドは出てこなくなります。

コンテンツのクラスにTitleメソッドを用意する。

ただし、これだけだと、ブレッドクラムの表示などに差支えるので、Title属性の値を提供してやる必要があります。そのため、コンテンツのクラスにTitleメソッドを追加します。

#encodeメソッドをインポートしておきます
from Products.Archetypes.Field import encode

class MyContent(BaseContent):
    ...
   def Title(self):
        """ 戻値がstrになるよう、encodeします。
        """
        return encode(self.getVersion() + u'版', self)

注意しなければならないのは、Titleの戻り値をstrにしておかなければならないことです。カタログ内では、Titleはstrとして格納されます。unicodeを渡してしまうと、カタログ内のインデックス比較の際に、比較対象のstr側をdecodeしてunicodeに変換しようとします。そこで失敗して、おなじみの"UnicodeDecodeError: 'ascii' codec can't decode..."が出てきます。

Archetypesにおける各フィールドの実装は、Field.pyのencodeメソッドを使うようになっているので、ここでもそれを使用します。encodeメソッドでは、コンテンツのgetCharSet()で使用するエンコードを決めているようです。



なお、この方法は、Plofessional Plone Bookの著者として有名な、Matin-Aspeliが、ArchetypesのMLに書いたものが元ネタです。(エンコードの部分は付け足しました)


元記事:Re: Display Archetype title as users name and date using ComputedField