我的Django应用程序中有一组键值对字典。字典中的值是字符串类型。
{u'question': u'forms.CharField(max_length=512)'}
我需要将这个“值”字符串转换为实际对象,然后得到类似的东西。
properties = {
'question' : forms.CharField(max_lenth=512)
}
请注意,第二个字典中的值是实际的Django表单字段而非字符串。我需要做这个操作来创建动态表单。第二个字典将被传递给“类型”内置函数。示例代码可以在此页面上找到。 http://dougalmatthews.com/articles/2009/dec/16/nicer-dynamic-forms-django/。
答案 0 :(得分:3)
如果你稍微修改你的表示:
fields = {u'question': u'{"field": "django.forms.CharField", "params": {"max_length": 512}}'}
然后您可以使用以下内容:
from django.utils import importlib, simplejson
def get_field(fname):
module, name = fname.rsplit('.', 1)
return getattr(importlib.import_module(module), name)
print dict((k.encode('ascii', 'ignore'), get_field(v['field'])(**v['params']))
for k, v in ((k, simplejson.loads(v)) for k, v in fields.iteritems()))
答案 1 :(得分:1)
根据您的代码,我建议将字段名称与字段attrs分开:
my_fields = {u'question': {'name': 'CharField', 'attrs': {'max_length': 512} }}
然后像:
properties = {}
for field_name, field_def in my_fields.items():
properties[field_name] = getattr(forms, field_def['name'])(**field_def['attrs'])
答案 2 :(得分:0)
编辑:根据OP澄清的评论,这不是一个合适的解决方案。
我不知道您所受到的限制,但以下表示可能会更好:
{u'question': lambda: forms.CharField(max_length=512)}
然后你可以“实现”这些领域:
dict((k, v()) for (k, v) in props.iteritems())