0

外部ソースから提供された初期データを 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

api_data_type選択要素にオプション値として「0」、「1」、「2」などがあり、変数から取得した長い説明ではないため、ジョブを実行できません。

ビューの選択フィールドのすべてのオプションから long_description を取得して、<option value="1">long_description</option>それぞれを比較できるようにするにはどうすればよい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]

そして、多対多のフィールドに入力しようとしているyaのいずれか(私の場合はチェックボックスとして)

# 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 に答える