应用
在oTree(和Django)中,app是一个包含Python和HTML代码的文件夹。当您创建oTree项目时,它会预先加载各种应用程序,例如 public_goods
和dictator
。会话基本上是一个接一个显示的应用程序序列。
创建应用
输入:
这将基于oTree模板创建一个新的app文件夹,其中大部分结构已经为您设置。
关键文件是models.py,pages.py和templates /文件夹下的HTML文件。
您可以将其视为可以根据需要添加的骨架。 您可以添加自己的类,函数,方法和属性,也可以导入任何第三方模块。
然后转到settings.py并在SESSION_CONFIGS中为您的应用创建一个与其他条目类似的条目。
组合应用
在您的SESSION_CONFIGS中,您可以通过设置组合应用程序'app_sequence'
。
在应用程序之间传递数据
请参阅participant.vars和session.vars。
回合
您可以通过在models.py中设置Constants.num_rounds来使游戏运行多轮。 例如,如果您的Session配置的app_sequence是['app1','app2'],其中app1的num_rounds = 3且app2的num_rounds = 1,那么您的会话将包含4个子会话。
回合数
您可以使用self.round_number
(此属性出现在subsession,group,player和page对象上)来获取当前的轮数。回合数字从1开始。
在轮次或应用程序之间传递数据
每轮都有单独的Subsession,Group和Player对象。 例如,假设您在第1轮中设置self.player.my_field = True。在第2轮中,如果您尝试访问self.player.my_field,您会发现其值为None(假设这是该字段的默认值)。 这是因为第1轮中的Player对象与第2轮中的Player对象是分开的。
要访问上一轮或应用程序中的数据,您可以使用下面描述的技术之一。
in_rounds,in_previous_rounds,in_round等
Player,group和subsession对象具有以下方法,它们的工作方式类似:
- in_previous_rounds()
- in_all_rounds()
- in_rounds()
- in_round()
player.in_previous_rounds()和player.in_all_rounds()每个都返回一个代表相同应用前几轮中同一参与者的玩家列表。 区别在于in_all_rounds()包括当前回合的玩家。
例如,如果您想计算参与者对所有前几轮游戏的收益,加上当前游戏的收益:
player.in_rounds(m,n)返回表示从轮次m到n的同一参与者的玩家列表。
player.in_round(m)只返回第m轮的玩家。 例如,要获得上一轮玩家的回报,你可以使用self.player.in_round(self.round_number - 1).payoff。
类似地,subsession对象具有以相同方式工作的方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m)。
组对象也有方法in_previous_rounds(),in_all_rounds(),in_rounds(m,n)和in_round(m),但请注意,如果在轮之间重新组合组,则这些方法可能不会返回任何有意义的内容。
participant.vars
如果要在不同应用程序之间传递数据,则应将此数据存储在参与者中,该数据在应用程序中保留(请参阅参与者)。 (in_all_rounds()仅在您需要访问同一应用程序的上一轮数据时才有用。)
participant.vars是一个可以存储任何数据的字典。 例如,您可以设置如下属性:
稍后在会话中(例如在单独的应用程序中),您可以像这样检索它:
如在这里所述,可以从页面或玩家访问当前参与者:
只要您检索Player实例(例如,使用get_players()或get_player_by_role()等),您也可以从Group或Subsession访问它。
如果您的key可能存在,也可能不存在,您可以使用.get()方法。 例如,self.participant.vars.get('my_var',DEFAULT_VALUE)。 更多这里。
或者您可以在self.participant.vars中测试'my_var'是否与'my_var'一起存在。
注意:participant.vars不包含在Excel / CSV数据导出中,也不包含在会话管理员的“数据”选项卡中。 如果需要,可以在player上创建一个StringField(例如,名为participant_vars_dump),然后在会话结束时指定:
(同样的概念适用于下面的session.vars。)
session.vars
对于会话中所有参与者相同的全局变量,可以使用self.session.vars。 这是一个像participant.vars一样的字典。 不同之处在于,如果在self.session.vars中设置变量,它将应用于会话中的所有参与者,而不仅仅是一个。
如此处所述,可以从Page对象或任何模型(Player,Group,Subsession等)访问会话对象。
可变轮数
如果你想要一个可变数量的轮数,考虑设置num_rounds
为某个高数字,然后在你的应用程序中,有条件地隐藏 元素,这样用户就无法进入下一页。{% next_button %}