0

フォームからデータを取得しようとしていますが、フォームはリストに基づいて何度も再現されます。各アイテムに 1 つのフォーム。フォームはチェックボックスとテキストフィールドで構成されています。チェックボックスがオンになっている場合は、付随するテキストフィールド データも必要です。

ここで関連する質問をしました:

Django 検証エラー u"'' 値は 10 進数である必要があります。"

これはほとんど解決されましたが、今では新しい問題があります。

見る:

        for item in request.POST.getlist('item_list'):
            item_id = int(item)
            item = Item.objects.get(id=item_id)
            item_name = item.name
            print item_name


            list = List(name = item_name, created_on = now, edited_on = now)

            for price in request.POST.getlist('price'):
                                if not price:
                                    continue
                print price
                list_item.price = Decimal(price)
                list_item.save()
            item.delete()

上には表示されていませんが、now = timezone.now().

テンプレート:

<form action="" method="post">

    {% csrf_token %}

    {% for item in item_list %}
        <input type="checkbox" name="item" value="{{item.id}}">{{item.name}} <input type="text" name="price"><br>
    {% endfor %}

    <input type="submit" value="Add Items">

</form>

フォームを送信すると、両方のループが 2 回実行され、すべてのアイテムの最終価格が同じになります。これは、コード全体に印刷関数を挿入し、表示される内容を分析して判断しました。私は問題がどこにあるかを理解していると思います.問題はそれを修正する方法です.どんな助けでも大歓迎です.

4

1 に答える 1

0

テンプレートは、次の行を何度も繰り返します。

<input type="checkbox" name="item" value="{{item.id}}">{{item.name}} <input type="text" name="price">

これにより、フィールドを含むフォームが作成itempriceれ、すべての行に複製されます。これは、フォームを作成する良い方法ではありません。

代わりに、name=属性の一意の値を持つ行を生成します。例えば、

<input type="checkbox" name="item_{{item.id}}">{{item.name}}
<input type="text" name="price_{{item.id}}">

次に、ビューに戻り、このループを使用して一致するペアを見つけます。

for key, value in request.POST.iteritems():
    if not name.startswith('item_'):
        continue
    name, item_id = key.split('_')
    if name == 'item':
        price = request.POST.get('price_%s' % item_id)
        # fetch the item, set the price
于 2013-08-28T23:06:05.753 に答える