2016-04-26 48 views
1

產品有很多項目。我可以在桌子上整齊地顯示特定產品的物品。但是,當我嘗試保存時,在回發時,只有表格中的最後一個元素保存爲該產品的所有項目。這可能是因爲我只返回從我的HTML返回的最後一個元素。任何人都可以告訴我任何優雅的方式來做到這一點?這是我的代碼。無法保存從Django模板項目列表

models.py

class Item(models.Model): 
    Product = models.ForeignKey("Product", related_name = "Attributes") 
    Name = models.CharField(max_length=1000, blank=True, null=True) 
    Type = models.CharField(max_length=1000, blank=True, null=True) 

forms.py

class ItemForm(ModelForm): 
    class Meta: 
     model = Item 
     fields = ['Name', 'Tag'] 

views.py

def getItems(request, product_id): 
    items = get_list_or_404(Item, Product = product_id) 
    itemslist = [] 
    if request.method == 'GET': 
     for item in items: 
      itemform = ItemForm(instance=item) 
      itemlist.append(itemform) 
    else: 
     for item in items: 
      itemform = ItemForm(request.POST, instance=item) 
      itemlist.append(itemform) 
     for tempform in itemlist: 
      if tempform.is_valid(): 
       tempform.save() 
    return render(request, 'knowledgebase.html', {'product_id': product_id, 'itemslist': itemslist}) 

HTML文件:

<tbody> 
    {% for itemform in itemslist%} 
     <tr> 
      <td class="td"> {{ itemform.Name }} </td> 
      <td> {{ itemform.Tag }} </td> 
     </tr> 
    {% endfor %} 
</tbody> 
+4

你應該使用一個formset這種事情。 –

+1

要添加Mr. Roseman的評論,請參閱https://docs.djangoproject.com/en/1.8/topics/forms/modelforms/#model-formsets瞭解如何設置模型表單集。視圖代碼將幾乎相同。 – theWanderer4865

回答

1

唯一的最後一種形式是保存,因爲您正在向模板發送要呈現的各個表單的列表。沒有看到你的HTML的其餘部分,我會說你只有一個提交按鈕。由於其他形式的沒有被供給上提交它們不被認爲綁定的數據,因此將不返回True時is_valid()被調用,並且不會達到tempform.save() https://docs.djangoproject.com/en/1.9/ref/forms/api/#bound-and-unbound-forms

嘗試打印出的每個的值tempform.is_bound()來測試這個。

緩解這種情況的一種方法是使用formset或爲每個模型實例創建包含多個字段的自定義表單。