2017-11-29 5 views
0

まず、globals()を使用しないでください。私はを知っている私はしないでください。しかし私はカスタムDjango APIを使用しています。コレクションAPIを使用することはできません(私が知る限り)ので、globals()を使用することにかなり悩まされています。入れ子のforループを使用してglobals()のオブジェクトを宣言する

私は、第1ラウンドで1つの選択肢、第2ラウンドで2つの選択肢、第3ラウンドで4つの選択肢を持つゲームをデザインしようとしています(ラウンドごとの選択肢を計算する式はnum_choices = 2^num_rounds)。もちろん、最初のラウンドには1つの選択しかないので、私はそれを静的に宣言しています。しかし、その後のラウンドのために、私は次のコードを使用しようとしています:

Traceback (most recent call last): 
File "/Library/Frameworks/Python.framework/Versions/3.5/bin/otree", line 11, in <module> 
sys.exit(otree_cli()) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/otree/management/cli.py", line 113, in otree_cli 
execute_from_command_line(argv) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/otree/management/cli.py", line 133, in execute_from_command_line 
utility.execute() 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/core/management/__init__.py", line 328, in execute 
django.setup() 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/__init__.py", line 18, in setup 
apps.populate(settings.INSTALLED_APPS) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/apps/registry.py", line 108, in populate 
app_config.import_models(all_models) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/django/apps/config.py", line 198, in import_models 
self.models_module = import_module(models_module_name) 
File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/importlib/__init__.py", line 126, in import_module 
return _bootstrap._gcd_import(name[level:], package, level) 
File "<frozen importlib._bootstrap>", line 986, in _gcd_import 
File "<frozen importlib._bootstrap>", line 969, in _find_and_load 
File "<frozen importlib._bootstrap>", line 958, in _find_and_load_unlocked 
File "<frozen importlib._bootstrap>", line 673, in _load_unlocked 
File "<frozen importlib._bootstrap_external>", line 662, in exec_module 
File "<frozen importlib._bootstrap>", line 222, in _call_with_frames_removed 
File "/Users/_____/exp_econ_test/turn_taking_strategic_match_all_players/models.py", line 209, in <module> 
class Player(BasePlayer): 
File "/Users/_____/exp_econ_test/turn_taking_strategic_match_all_players/models.py", line 261, in Player 
initial=Constants.choice1_name 
IndexError: tuple index out of range 

I:私は私のDjangoアプリケーションを実行しようとすると、しかし

for i in range(2, NUM_ROUNDS): 
    dec_num = math.pow(2, i) 
    for j in range(1, int(dec_num)): 
     globals()['dec_r{}_{}'.format(i).format(j)] = models.CharField(
      choices=list_of_choices, 
      widget=widgets.RadioSelect(), 
      blank=False, 
      initial='blank' 
) 

を、私は次のようなエラー(トレースバック)を受け取ります私は変数名を宣言する方法と関係があると考えます。私が使用できる代替品はありますか?ありがとう!

+0

このエラーの原因は、どの回線ですか? –

+0

また、グローバル範囲でモデルフィールドを作成しようとしていますか?それは何か役に立つものではないでしょう。実際に達成しようとしていることは何ですか? –

+0

エラーの原因となっている行は明らかに 'initial = 'blank''ですが、削除すると、代わりに空白= Falseからエラーがスローされます。ラウンドナンバーだけを使用してこのメ​​ソッドを使用して宣言しても、同じ問題は発生しません。http://stupidpythonideas.blogspot.com.au/2013/05/why-you-dont-want-to-dynamically- create.html – Krabo

答えて

0

あなたの質問はモデルについて言及していますが、コメントではフォームフィールドについて話します。これを行うべきではなく、フォームの__init__メソッドにフィールドを追加してください。

self.fields['whatever'] = forms.CharField(...) 
+0

Otreeにはparticipant.vars変数とsession.vars変数がありますので、それを使用することができます。 – Krabo

関連する問題