2015-10-14 2 views
0

Я не понимаю, почему, но экземпляр всегда создается, копируя тот, который я пытаюсь редактировать. Кроме того, поскольку я вижу, что FormSet, который я использую, не имеет параметра «экземпляр», который должен быть добавлен в его конструктор. В любом случае проблема заключается в том, что экземпляр как Offer, так и OfferItem генерируется при редактировании объекта.save() генерация новой записи вместо обновления 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

Я нашел проблему: так как я использую ту же функцию View либо изменить или добавить новую запись, на моей форме шаблона, я должен убедиться, что я тоже если я редактирую или нет, потому что функция принимает параметр в случае, если я редактирую. В этом случае я должен изменить URL-адрес в форме Post.

Только глупая ошибка взяла меня на несколько часов, чтобы узнать.

Смежные вопросы