高度な機能¶
これらの機能の多くはは oTree スタジオにおいて、サポートされていません。
ExtraModel¶
ExtraModel は1人の参加者に関して多くのデータを保存する必要がある場合に役立ちます。たとえば、入札のリストや反応時間のリスト等です。それらは ライブページ とともに頻繁に使用されます。
ExtraModel は他のモデルとリンクする必要があります。
class Bid(ExtraModel):
player = models.Link(Player)
amount = models.CurrencyField()
参加者が入札するたびに、データベースに保存されます。
Bid.create(player=player, amount=500)
そして、参加者の入札のリストを取得できます。
bids = Bid.filter(player=player)
ExtraModel は複数のリンクを保持することができます。
class Offer(ExtraModel):
sender = models.Link(Player)
receiver = models.Link(Player)
group = models.Link(Group)
amount = models.CurrencyField()
accepted = models.BooleanField()
そして、さまざまな方法でクエリを実行できます。
this_group_offers = Offer.filter(group=group)
offers_i_accepted = Offer.filter(receiver=player, accepted=True)
より複雑なフィルタやソートのためには、リスト操作を使う必要があります。
offers_over_500 = [o for o in Offer.filter(group=group) if o.amount > 500]
CSVスプレッドシートの各行からExtraModelデータを生成する方法を示している、Stroopタスクなどの心理学ゲームの例を参照してください。
To export your ExtraModel data to CSV/Excel, use カスタムデータのエクスポート.
Reading CSV files¶
注釈
This feature is in beta (new in oTree 5.8.2)
To read a CSV file (which can be produced by Excel or any other spreadsheet app),
you can use read_csv()
. For example, if you have a CSV file like this:
name,price,is_organic
Apple,0.99,TRUE
Mango,3.79,FALSE
read_csv()
will output a list of dicts, like:
[dict(name='Apple', price=0.99, is_organic=True),
dict(name='Mango', price=3.79, is_organic=False)]
You call the function like this:
rows = read_csv('my_app/my_data.csv', Product)
The second argument is a class that specifies the datatype of each column:
class Product(ExtraModel):
name = models.StringField()
price = models.FloatField()
is_organic = models.BooleanField()
(Without this info, it would be ambiguous whether TRUE
is supposed to be a bool,
or the string 'TRUE'
, etc.)
read_csv()
does not actually create any instances of that class.
If you want that, you must use .create()
additionally:
rows = read_csv('my_app/my_data.csv', Product)
for row in rows:
Product.create(
name=row['name'],
price=row['price'],
is_organic=row['is_organic'],
# any other args:
player=player,
)
The model can be an ExtraModel
, Player
, Group
, or Subsession
.
It's fine if it also contains other fields; they will be ignored by read_csv()
.
テンプレート¶
template_name¶
テンプレートの名前をページクラスとは異なるものにする必要がある場合(たとえば、複数のページで同じテンプレートを共有している場合)、 template_name
を設定します。例:
class Page1(Page):
template_name = 'app_name/MyPage.html'
静的ファイル¶
ページに画像(または.css、.jsなどの他の静的ファイル)を含める方法は次のとおりです。
oTreeプロジェクトのルートには、 _static/
フォルダがあります。たとえば、そこに puppy.jpg
のようなファイルを配置します。テンプレートで、 {{ static 'puppy.jpg' }}
を使用してそのファイルへのURLを取得することができます。
画像を表示するには、次のような <img>
タグを使用します。
<img src="{{ static 'puppy.jpg' }}"/>
上記で画像を _static/puppy.jpg
に保存しましたが、実際には、ファイル名の競合を防ぐために、アプリの名前でサブフォルダーを作成し、 _static/アプリ名/puppy.jpg
として保存することをおすすめします。
次に、HTMLコードは次のようになります。
<img src="{{ static 'your_app_name/puppy.jpg }}"/>
(必要に応じて、静的ファイルをアプリフォルダー内のサブフォルダー static/your_app_name
に配置することもできます)
静的ファイルを変更しても更新されない場合は、ブラウザがファイルをキャッシュしていることが考えられます。ページ全体をリロードすることで解決する可能性があります。(通常はCtrl + F5)
ビデオや高解像度の画像がある場合は、オンライン上に保存し、URLで参照することをお勧めします。ファイルサイズが大きいと .otreezip ファイルのアップロードが非常に遅くなる可能性があるためです。
Wait page¶
カスタム wait page テンプレート¶
You can make a custom wait page template.
For example, save this to your_app_name/MyWaitPage.html
:
{{ extends 'otree/WaitPage.html' }}
{{ block title }}{{ title_text }}{{ endblock }}
{{ block content }}
{{ body_text }}
<p>
My custom content here.
</p>
{{ endblock }}
次に、wait page にこのテンプレートを使用するように指示します。
class MyWaitPage(WaitPage):
template_name = 'your_app_name/MyWaitPage.html'
そして、通常の方法で vars_for_template
を使用できます。実際、 body_text
と title_text
属性は、 vars_for_template
の設定のための省略形にすぎません。次の2つのコードは同等です。
class MyWaitPage(WaitPage):
body_text = "foo"
class MyWaitPage(WaitPage):
@staticmethod
def vars_for_template(player):
return dict(body_text="foo")
カスタム wait page テンプレートをグローバルに適用する場合は、 _templates/global/WaitPage.html
テンプレートを保存することで、oTreeは組み込みの wait page ではなく、カスタム wait page を使うように設定されます。
通貨¶
"points" の名前を "tokens" や "credits" のような他の名前にカスタマイズするためには、 POINTS_CUSTOM_NAME
を設定します。例えば、 POINTS_CUSTOM_NAME = 'tokens'
REAL_WORLD_CURRENCY_DECIMAL_PLACES
を設定すると、実際の通貨金額の小数点以下の桁数を変更できます。小数点以下の桁数が表示されても、常に0である場合は、データベースをリセットする必要があります。