【问题标题】:Django set form initial data in viewDjango 在视图中设置表单初始数据
【发布时间】:2012-07-30 23:44:01
【问题描述】:

我正在尝试使用从外部来源提供的初始数据填充 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']

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

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'}),
            ...
        }

【问题讨论】:

    标签: django django-forms modelform


    【解决方案1】:

    了解如何完成我的要求。

    # 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)

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

    【讨论】:

      猜你喜欢
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      • 2014-12-28
      相关资源
      最近更新 更多