2015-10-14 46 views
0

我不明白爲什麼,但一個實例總是被創建複製我正在嘗試編輯。此外,正如我所看到的FormSet我沒有一個「實例」參數被添加到它的構造函數。無論如何,問題在於我在編輯對象時會生成Offer和OfferItem的實例。保存()生成新的條目,而不是更新Django

def manage_offer(request, number=None): 
    param_offer = Offer.objects.filter(id=number).first() 
    param_items = OfferItem.objects.filter(offer=param_offer).values() 

if request.method == 'POST': 
    offer_form = OfferForm(request.POST, instance=param_offer) 
    item_formset = OfferItemFormSet(request.POST, initial=param_items) 

    if offer_form.is_valid() and item_formset.is_valid(): 

     # User selected go back and correct something 
     if request.POST.get('back', False): 

      return render(request, 
          'offer_edit.html', 
           { 
            'forms': offer_form, 
            'formset': item_formset, 
            'offer_edit': True, 
           }) 

     # Proceeds with either saving or submitting request 

     offer = offer_form.save(commit=False) 
     offer.tax = offer_form.cleaned_data['tax'].value 

     #Sotres items to be sent back to commit part 
     offer_items = [] 
     #Gets the items from the form and stores them to conf. page 
     for item_in_formset in item_formset.forms: 
      item = item_in_formset.save(commit=False) 
      item.item_code = get_item_code(item_in_formset.cleaned_data['name']) 
      item.type = get_item_type(item_in_formset.cleaned_data['name']) 
      offer.update_total(item.calc_total()) 
      # Adds items into list for invoice_ready page 
      offer_items.append(item) 

     # Request goes to confirmation page 
     if request.POST.get('proceed', False): 

      return render(request, 
          'offer_edit.html', 
           { 
            'offer_form': offer_form, 
            'item_formset': item_formset, 
            'offer_ready': True, 
            'offer': offer, 
            'items': offer_items, 
           }) 
     # Passes confirmation page and saves offer 
     offer.save() 
     # Makes sure the value is correct by recalculating 
     offer.reset_total() 

     for obj_item in offer_items: 
      obj_item.offer = offer 
      offer.update_total(obj_item.calc_total()) 
      #commits to DB 
      offer.save() 
      obj_item.save() 

     return render(request, 
         'offer_edit.html', 
          { 
           'success_add_offer': True, 
           'offer': offer, 
          }, 
        ) 

# GET generates a blank or instanced page 
else: 
    offer_form = OfferForm(initial= 
           {'company': Company.objects.filter(is_default=True).first(), 
           'tax': Tax.objects.filter(is_default=True).first() 
           }, instance=param_offer) 
    item_formset = OfferItemFormSet(initial=param_items) 

return render(request, 'offer_edit.html', 
       { 
        'forms': offer_form, 
        'formset': item_formset, 
        'edit_offer': number, 
       }) 

Forms.py

class OfferItemForm(ModelForm): 

class Meta: 
    model = OfferItem 
    # Some widgets and stuff ... 

class RequiredFormSet(BaseFormSet): 
    def __init__(self, *args, **kwargs): 
     super(RequiredFormSet, self).__init__(*args, **kwargs) 
     for form in self.forms: 
      form.empty_permitted = False 

OfferItemFormSet = formset_factory(OfferItemForm, formset=RequiredFormSet) 
+0

你的'manage_offer'函數是否打算返回一些東西?爲什麼你將'number'參數設置爲None? – chem1st

+0

因爲如果沒有提供號碼,它將創建一個新條目而不是編輯一個。爲了調試的目的,我手動將None設置爲1或2,具體取決於我的輸入,但仍然遇到同樣的問題。 –

+0

你有沒有檢查表單實際上是否將'param_offer'作爲一個實例? – chem1st

回答

0

我發現了問題:因爲我使用同樣的搜索功能來編輯或增加新的項目,我的模板表格上我必須確保我也是確定我是否正在編輯,因爲該函數在我正在編輯時需要一個參數。在這種情況下,我必須更改帖子表單中的網址。

只是一個愚蠢的錯誤花了我幾個小時才知道。

相關問題