Я сделал это с помощью поведения, адаптировав его к INameFromTitle
в moodiors.py
class INameFromBrandAndModel(Interface):
""" Interface to adapt to INameFromTitle """
class NameFromBrandAndModel(object):
""" Adapter to INameFromTitle """
implements(INameFromTitle)
adapts(INameFromBrandAndModel)
def __init__(self, context):
pass
def __new__(cls, context):
brand = context.brand
model = context.modeltype
title = u'%s %s' % (brand,model)
inst = super(NameFromBrandAndModel, cls).__new__(cls)
inst.title = title
context.setTitle(title)
return inst
в moodiors.zcml или configure.zcml
<plone:behavior
title="Name from brand and model"
description="generates a name from brand and model attributes"
for="plone.dexterity.interfaces.IDexterityContent"
provides=".behavios.INameFromBrandAndModel"
/>
<adapter factory=".behaviors.NameFromBrandAndModel" />
Затем отключите поведение INameFromTitle в profiles/types/your.contenttype.xml
.
Вуаля.Это очень хорошо интегрируется и показывает правильный заголовок в представлении и навигации по умолчанию.При удалении context.setTitle(title)
из адаптера у нас останется только правильный идентификатор, но заголовок не будет установлен.
Это не изменит заголовок автоматически после редактирования.До сих пор мне не удалось переопределить свойство klass
моих типов контента, как это часто предлагалось.
Если вы определяете атрибут title
в своей схеме, например:
class IBike(form.Schema):
"""A bike
"""
title = schema.TextLine(
title = _(u'Title'),
required = False,
)
Вы можете легко изменить заголовок позже.Во избежание недоразумений необходимо скрыть поле заголовка в addForm.