2016-12-30 48 views
0

在Django中,您經常需要將許多變量添加到字典(視圖中的上下文)中。這些變量的名稱往往很大,以清楚它是什麼。按值添加到詞典(並生成密鑰)

例子:

userprofile_creation_form = UserProfileCreationForm() 

這是不舒服,當你有很多這樣的變量,寫鍵他們,因爲鑰匙往往都是相同的變量名。

context['userprofile_creation_form'] = userprofile_creation_form 
... imagine 6 other variables 
... 
... 

所以我想能夠把變量放入字典中,只是使用這個變量,名字就會從它的名字中生成。

像:

context.add(userprofile_creation_form) 

>>> context 
>>> {'userprofile_creation_form':<Form userprofile_creation_form>, ... } 

是否有可能做的,不知怎的,在python或者是有一些模塊或解決方法,可以提供這種行爲?

+0

@DavidZ我認爲這不是一個確切的副本。您分配的問題詢問了如何從一個變量中提取名稱,這個變量可以是我的解決方案的一部分,但有更多可能的答案。例如,也許存在可以提供這種行爲的模塊(如OrderedDict,DefaultDict等)。 –

+0

這聽起來像是你錯過了問題的另一半,它詢問了相反的操作,將變量的名稱作爲關鍵字將變量放入字典中。這是_exactly_你在問什麼。 –

回答

0

在下面的例子中,form.__class__.__name__給窗體類的名稱:

for form in my_forms: 
    k = ''.join('_{}'.format(c.lower()) if c.isupper() else c for c in form.__class__.__name__).lstrip('_') 
    context[k] = form 

例子:

>>> class MyForm1: 
...  pass 
... 
>>> class MyForm2: 
...  pass 
... 
>>> 
>>> my_forms = [MyForm1(), MyForm2()] 
>>> 
>>> context = {} 
>>> 
>>> for form in my_forms: 
...  k = ''.join('_{}'.format(c.lower()) if c.isupper() else c for c in form.__class__.__name__).lstrip('_') 
...  context[k] = form 
... 
>>> context 
{'my_form1': <__main__.MyForm1 instance at 0x0000000002653188>, 'my_form2': <__main__.MyForm2 instance at 0x0000000002653548>} 
>>> 

如果你想你的形式與確切的名字添加到context,使用:

>>> for form in my_forms: 
...  context[form.__class__.__name__] = form 
... 
>>> context 
{'MyForm2': <__main__.MyForm2 instance at 0x0000000002713548>, 'MyForm1': <__main__.MyForm1 instance at 0x0000000002713188>}