Python:将unicode字符串转换为原始对象/文本

时间:2011-03-14 08:49:55

标签: python django forms unicode

我的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/

3 个答案:

答案 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())