0

我正在尝试使用从外部源提供的初始数据填充 django modelform。为了实现这一点,我首先从外部源中提取所有需要的数据:

url =('http://myapi.example.com')
data = urllib2.urlopen(url)
result = json.load(data)

api_data_name = result['properties']['name']
api_data_type = result['properties']['type']

然后填充一个字典,它将作为我表单的初始数据:

data = {}
for field in my_model._meta.fields:
    if field.name == 'name':
        data[field.name] = api_data_name
form = MyEditForm(initial=data)

然后我将表单传递给模板,初始数据正在按预期填充我的文本字段,但现在我需要能够根据从外部源收到的字符串设置选择字段的值,而我没有得到我怎么能做到这一点,因为做了类似的事情:

if field.name == 'type':
    data[field.name] = api_data_type

无法完成这项工作,因为选择元素具有“0”、“1”、“2”等作为选项值,而不是我从api_data_type变量中获得的长描述。

如何从<option value="1">long_description</option>我的视图中选择字段的所有选项中获取 long_description,以便我可以将每个选项与api_data_type?

下面是我的 models.py 和 forms.py 的示例:

#models.py

TYPE = (
    ('0',_(u'Type1')),
    ('1',_(u'Type2')),
    ('2',_(u'Type3')),
)

class MyModel(models.Model):
    ...
    type=models.CharField(max_length=30,choices=TYPE,blank=True)
    ...

#forms.py
class MyEditForm(forms.ModelForm):
    class Meta:
        model = MyModel

        widgets = {
            ...
            'type': Select(attrs={'class':'select-small span2'}),
            ...
        }
4

1 回答 1

0

了解如何完成我的要求。

# For select fields
if field.name == 'classification':
    for choice in field.choices:
        if choice[1].lower() == api_poi_classification.lower():
            data[field.name] = choice[0]

对于任何试图填充​​多对多字段的人(在我的例子中是复选框)

# Many to many fields populate          
for field in hotel_poi._meta.many_to_many:
    if field.name == 'views':
        if u'Vista' in api_poi_review_fields:
            api_vistas = api_poi_review[u'Vista']
            # The api_vistas string comes from api in the format (v1; v2; v3; v4)
            views = api_vistas.split(';')
            choices = field.get_choices()
            temp = []
            for view in views:
                for choice in choices:
                    if view.lower().strip() == choice[1].lower().strip():
                    temp.append(choice[0])          
            data[field.name]=temp

如果我有直接的数据库访问权限,所有这些都可以避免......在这种情况下,我只需要设置一个对象实例m = MyModel.objects.filter(id=1)并调用form = MyEditForm(instance=m)

但事实并非如此,这就是使这个问题有点特别的原因。

于 2012-08-09T21:42:47.093 回答