2011-05-24 6 views
3

Ceci est mon models.pyDjango inlineformset - méthode d'enregistrement personnalisé

class Invoices(models.Model): 
    ... 
    sum_w_vat = models.DecimalField(max_digits=7, decimal_places=2, default=0) 
    sum_wo_vat = models.DecimalField(max_digits=7, decimal_places=2, default=0) 
    sum_discount = models.DecimalField(max_digits=7, decimal_places=2, default=0) 
    sum_vat = models.DecimalField(max_digits=7, decimal_places=2, default=0) 
    sum_paid = models.DecimalField(max_digits=7, decimal_places=2, default=0) 
    ... 

class InvoiceItems(models.Model): 
    invoice = models.ForeignKey(Invoices) 
    quantity = models.DecimalField(max_digits=9, decimal_places=2) 
    unit = models.ForeignKey(StocklistUnits, verbose_name='Merska enota') 
    price = models.DecimalField(max_digits=9, decimal_places=2) 
    vat = models.DecimalField(max_digits=4, decimal_places=3) 
    discount = models.DecimalField(max_digits=3, decimal_places=1) 
    def save(self, **kwargs): 
     self.invoice.sum_w_vat += (self.price * self.quantity * self.vat) * self.discount 
     self.invoice.sum_wo_vat += (self.price * self.quantity) * self.discount 
     self.invoice.sum_discount += (self.price * self.quantity) * (self.discount/100) 
     self.invoice.sum_vat += ((self.price * self.quantity * self.vat) * self.discount) - ((self.price * self.quantity) * self.discount) 
     super(InvoicesItems, self).save(**kwargs) 

Je ne sais pas comment enregistrer les données calculées dans le InvoiceItems redéfini la fonction d'économie ... cela ne fonctionne évidemment pas, parce que Invoices être sauvé d'abord ...

views.py

def edit(request, id = None): 
InvoiceFormSet = inlineformset_factory(Invoices, InvoicesItems) 

if id == None: 
    initial_data = '' 
    data = Invoices() 
else: 
    data = get_object_or_404(Invoices, pk=id) 
    initial_data = '' 

if request.method == 'POST': 
    created_invoice = InvoicesForm(request.POST, instance=data) 

    form = InvoiceFormSet(request.POST, instance=data) 

    if not form.is_valid() and not created_invoice.is_valid(): 
     //json err msg 
    else: 
     created_invoice.save() 
     form.save() 


    json = simplejson.dumps(response, ensure_ascii=False) 
    return HttpResponse(json, mimetype="application/json") 
else: 
    form = InvoicesForm(instance=data, initial=initial_data) 
    form_items = InvoiceFormSet(instance=data) 
    c = {'form':form, 'form_items':form_items} 
    c.update(csrf(request)) 
    return render_to_response('crud_invoice_edit.html', c) 

Comment puis-je itérer le InvoiceItems et calculer le champ qu'il faut ensuite être inséré dans Invoices. Je suis nouveau à django ...

Merci!

Répondre

0

Je ne sais pas si cela est la bonne ... mais il fonctionne ...

Tout ce que je devais faire était de sauver le nouveau created_invoice ... si

created_invoice.save() 
form.save() 
created_invoice.save() 
+0

I Je suis avec le même problème et j'ai eu la même réponse par moi-même, mais je pense que c'est loin d'être élégant. – vmassuchetto

Questions connexes