タイトルのないコンテンツタイプを作る
タイトルのないコンテンツタイプといえば、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