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,)