1

我是oTreeoTree Studio的新手,所以如果我的问题没有多大意义,我提前道歉。我也是 Stack Overflow 的新手,所以如果我重复了一个问题,我深表歉意。

我正在使用 oTree Studio 为实验室实验编写应用程序。在该实验中,参与者获得了一系列“机会”,以具有货币价值的“点”的形式交换资源。机会分为几轮,在给定的一轮中,每个参与者可以与最多 2 个其他参与者共享她的资源。重要的是,参与者不能将她的资源转移给自己;资源只能转移给另一个参与者。

现在,在每一轮中,实验中的所有参与者,除了给定的一个,都列在屏幕上。然后针对其他每个主题询问参与者是否想将她的资源转移给该参与者。为此,我为每个参与者创建了一个整数字段表单,如果参与者将她的资源转移给特定的接收者,则其值为 1,否则为 0(默认值)。关键是与给定参与者对应的表单字段是隐藏的,以防止参与者将资源转移给自己。我这样做如下:

{% if player.id_in_group != 1 %} {% formfield player.ile1 %} {% else %}     {% endif %}

然而,问题是,一旦参与者完成屏幕并单击“下一步”,就会显示一条错误消息说

请更正表格中的错误。

可以尝试通过允许“空”表单来避免该问题,以便与给定参与者对应的隐藏表单字段可以不填写。但是我不能施加额外的限制,例如将潜在收件人的数量限制为 2。我的意思是我已经为参与者定义了以下错误消息:

if values['ile1'] + values['ile2'] + ... > 2: return 'The maximum number of recipients exceeded.'

但随后应用程序失败并显示一条错误消息说

+ 不支持的操作数类型:“NoneType”和“int”

所以,我想,我正在寻找一种将这两件事结合起来的方法:(a)允许表单字段不填写,同时,(b)对收件人的最大数量施加限制. 有人知道怎么做这个吗?

4

1 回答 1

0

使用 get_form_fields 根据 self.player.id_in_group 显示不同的字段:https ://otree.readthedocs.io/en/latest/forms.html#determining-form-fields-dynamically

于 2020-06-08T15:41:59.707 回答