高度な機能

これらの機能の多くはは 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 とベーステンプレート

アプリのすべてのページに同じ JS / CSS を含めるには、 静的ファイル にテンプレートを配置するか、includable template にテンプレートを配置する必要があります。

静的ファイル

ページに画像(または.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_texttitle_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である場合は、データベースをリセットする必要があります。