2016-12-30 57 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>}