我正在尝试使用外部源提供的初始数据填充django模型。为实现这一点,我首先从外部源获取所有需要的数据:
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']
然后填充一个dict,它将作为我表单的初始数据:
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
不要做的工作因为select元素有“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'}),
...
}
答案 0 :(得分: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)
但情况并非如此,这就是使这个问题有点特别的原因。