Django Python:在运行时创建的多个字段的Eval语法

时间:2009-03-18 01:32:35

标签: django-forms

我的eval语法不正确。也就是说,对于每个类别,我想输出名为category_task的ModelChoiceField,即。如果类别“有趣”,则选择无线电选择字段 将输出'fun_tasks'。

categories = Category.objects.all()

for category in categories:
    eval(category)_tasks = form.ModelChoiceField(
        queryset         = Task.objects.filter(method__category=category),
        widget           = RadioSelect
    )

1 个答案:

答案 0 :(得分:4)

“eval是邪恶的。”

好吧,它有它的用途,但是90%的eval使用率(使用任何语言)都是错误的,所以如果你发现自己写了一个eval,你应该停下来检查你正在做什么,并且极度怀疑。

eval(category)_tasks = x

如果你正在做一个赋值,那就是一个语句而不是一个表达式,所以你必须使用exec而不是eval:

exec category+'_tasks= x'

然而,exec和eval一样邪恶!

您可以在Python中编写变量,而无需解析/评估Python代码:

locals()[category+'_tasks']= x

或者,如果你想在当前范围内写一个全局变量而不是一个变量,用localals()替换locals()。

虽然这比eval / exec好,但它仍然比较臭。你很少想要完全动态命名的变量;查找通常更清晰:

catlookup= {}
catlookup[category]= x

虽然没有更多的背景,但很难说出最适合你的情况。