relationfield

Dexterity提供了強大的物件關聯功能,將二種不同類型content之間的關聯設計更直覺

舉例,可以將電影院與電影這二種不同類型的content做一個關聯,也就是

國賓戲院目前正在播映的電影有「蜘蛛人、鋼鐵人、玩具總動員…」

相反的

蜘蛛人目前正在「國賓戲院、哈啦影城、華納威秀…」播放

如此,二種不同類型的物件就產生了關聯

實作的方式如下:

content type 設計如下:

#以下是會用到的import
from z3c.relationfield.schema import RelationList, RelationChoice #產生關聯用
from content.cinema import ICinema #電影院的Interface
from plone.formwidget.autocomplete import AutocompleteMultiFieldWidget, AutocompleteFieldWidget #自動完成機制


class IMovie(form.Schema, IImageScaleTraversable):
    ...
    form.widget(relationCinema=AutocompleteMultiFieldWidget)  #這個可以讓表單自動完成,但要配合javascript
    relationCinema = RelationList(                #多值
        title=_(u"Relation Cinema"),
        value_type=RelationChoice(
            source=ObjPathSourceBinder(
                object_provides=ICinema.__identifier__,    #指定content type 的 Interface
            ),
        ),
        required=False,
    )

打完收工,回到前台試試看,關連性就這麼完成了

以本範例而言,因為電影院是比較固定不會變動的,電影則是每周會有變化,所以關聯性設計,就設計在電影的content type,會是比較好的選擇

電影院的content type不用再設計一個對電影的關聯,使用 back-reference 查找播放電影, 就能輕鬆達成

如果要使用單選的關聯性,可以使用RelationChoice,程式碼如下:

    form.widget(single=AutocompleteFieldWidget)
    single = RelationChoice(
        title=_(u"Single"),
        source=ObjPathSourceBinder(object_provides=IInterface.__identifier__),
        required=False,)