Как использовать атрибут типа ловкости в качестве части URL

Я пишу тип контента, подобный этому, с ловкостью:

class IArticle(form.Schema):

    title = schema.TextLine(
        title=_(u"Name"),
    )

    code = schema.TextLine(
        title=_(u"Code"),
    )

Если какой-либо пользователь создаст новую статью, установив «foo» в качестве заголовка и «bar» в качестве кода, заголовок будет «foo», а URL-адрес статьи будет «.../foo». Как я могу сделать так, чтобы URL-адрес контента был ".../bar"?


person Daniel Hernández    schedule 23.12.2012    source источник


Ответы (2)


Что вы хотите сделать, так это повлиять на выбор имени, и вы можете сделать это с помощью настраиваемого поведения для вашего интерфейса.

Создание подкласса интерфейса INameForTitle является самым простым:

from plone.app.content.interfaces import INameFromTitle
from zope import interface, component

from ..types.interfaces import IArticle


class INameFromCode(INameFromTitle):
    pass

class ArticleCodeAsTitle(object):
    component.adapts(IArticle)
    interface.implements(INameFromCode)

    def __init__(self, context):
        self.context = context

    @property
    def title(self):
        return self.context.code

Средство выбора имени по умолчанию пытается адаптировать новый добавляемый объект к интерфейсу INameForTitle, а затем, если это удается, будет использовать атрибут .title для создания нового имени для объекта. Реализуя подкласс этого интерфейса в качестве адаптера для ваших объектов IArticle, вы вместо этого заменяете заголовок на свое поле .code, тем самым обеспечивая его использование для новых имен.

Зарегистрируйте это как:

<configure
    xmlns="http://namespaces.zope.org/zope"
    xmlns:plone="http://namespaces.plone.org/plone"
    i18n_domain="your.i18n.domain"
    >

<plone:behavior
    title="ArticleCode"
    description="Use .code as the title when choosing a new object name"
    provides=".articlecode.INameFromCode"
    factory=".articlecode.ArticleCodeAsTitle"
    for="..types.interfaces.IArticle"
    />

</configure>

и добавьте это поведение в определение типа Article вместо поведения INameFromTitle.

person Martijn Pieters    schedule 23.12.2012

Создайте настраиваемое поведение, чтобы установить для идентификатора объекта code значение атрибута:

person aclark    schedule 23.12.2012