oTree Forum >

For loops in class definition

#1 by janohirmas

Hi everyone, 

I am programming an experiment where the player class has a sequence of variables with common names that depend on a game constant. I want to run something like:

    for i in range(1,C.iOpts+1):
        exec(f"dec{i} = models.StringField()")
        
 If I run the server and add this, it works perfectly, but if I open the server, I get an error saying that player has variable 'i' that is nor a model field:
 Error(title='NonModelFieldAttr: Player has attribute "i", which is not a model field, and will therefore not be saved to the database. Consider 
changing to "i = models.IntegerField(initial=13)"', id=111, app_name='Task1')

Is there any way around this?

Thanks!

#2 by BonnEconLab

After class Player(BasePlayer):, put the following on the top level of your __init__.py file — that is, OUTSIDE class Player(BasePlayer):

for i in range(1, C.iOpts + 1):
    setattr(Player, f"dec{i}", models.IntegerField())

See the post by gr0ssmann on https://www.otreehub.com/forum/202/.

For the associated page, you can use a loop as follows if you would like to include all of the generated player fields:

class MyPage(Page):

    form_model = 'player'
    form_fields = [f'dec{i}' for i in range(1, C.iOpts + 1)]

#3 by janohirmas

Thank you!

Write a reply

Set forum username