我正在尝试从表单中获取数据,表单基于列表被多次复制。每个项目的一种形式。表单由复选框和文本字段组成。如果选中该复选框,那么我也需要附带的文本字段数据。
我在这里问了一个相关的问题:
Django validation error u"'' value must be a decimal number."
现在我已经解决了一个新问题。
视图:
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>
当我提交表单时,它现在会在两个循环中运行两次,并且所有项目的最终价格都相同。我通过在整个代码中插入打印功能并分析显示内容来确定这一点。我想我明白问题在哪里,问题是如何纠正它,任何帮助都会非常感激。
答案 0 :(得分:0)
您的模板多次重复以下行:
<input type="checkbox" name="item" value="{{item.id}}">{{item.name}} <input type="text" name="price">
这会创建一个表单,其中每个行都会复制字段item
和price
。这不是创建表单的好方法。
而是生成具有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