justStarting
justStarting

Reputation: 129

Update database from view

View.py

@login_required
def UnosPosudbe(request):
    if request.method == 'GET':
        forma = PosudbaForma()
    elif request.method == 'POST':
        forma = PosudbaForma(request.POST,request.FILES)
        if forma.is_valid():
            #Dohvacanje Kolicine
            kolicinaKnjige = str(forma.cleaned_data['nazivKnjige'])
            IDKnjige = kolicinaKnjige

            kolicinaKnjige = kolicinaKnjige[-1:]
            IDKnjige = IDKnjige[:1]

            unesenaKolicina = forma.cleaned_data['kolicina']
            if(int(kolicinaKnjige)>=unesenaKolicina and unesenaKolicina > 0):
                #update kolicine
                knjiga = Knjiga.objects.get(pk=IDKnjige)
                knjiga.kolicina = int(knjiga.kolicina) - int(unesenaKolicina)
                print(knjiga)
                knjiga_forma = KnjigaForma(request.POST, instance = knjiga)
                knjiga_forma.save() 
                #
                forma.save()
                return redirect('pregledPosudbe')
    return render(request, 'unosPosudbe.html', {'forma':forma})  

I am trying to update database with part of code but I am keep getting error:

knjiga = Knjiga.objects.get(pk=IDKnjige)
                knjiga.kolicina = int(knjiga.kolicina) - int(unesenaKolicina)
                print(knjiga)
                knjiga_forma = KnjigaForma(request.POST, instance = knjiga)
                knjiga_forma.save() 

Error:

ValueError at /UnosPosudbe/ The Knjiga could not be changed because the data didn't validate.

I am not sure what I am doing wrong?

Models.py

class Knjiga(models.Model):
    naziv = models.CharField(null=False, blank=True, max_length=120)
    autor = models.ForeignKey(Autor, on_delete=models.CASCADE, null=True)   
    datumObjave = models.DateField(null=True, blank=False)
    izdanje = models.CharField(null=True, blank=True, max_length=120)
    slika= models.FileField(upload_to='images/', null=True, verbose_name="") #videofile
    kolicina = models.IntegerField(null=False, blank=False)

    def __str__(self):
        return str(self.id) + ', ' +str(self.naziv) + ', ' + str(self.autor) + ', Kolicina:' + str(self.kolicina)

-----UPDATE----

Everything works for above problem. But now I want to do when I delete created line that it gets quantity back to my "knjiga.kolicina".

Delete works like:

@login_required def deletePosudbe(request, id): data = Posudba.objects.get(id=id)

IDKnjige = data
kolicinaKnjige = IDKnjige[-1:]
IDKnjige = IDKnjige[:1]

print(kolicinaKnjige)
print(IDKnjige)

data.delete()
return redirect('pregledPosudbe') 

I get error:

TypeError at /deletePosudbe/22 'Posudba' object is not subscriptable

I am trying to do same to fetch ID and quantity and update it back.

Upvotes: 0

Views: 73

Answers (1)

gachdavit
gachdavit

Reputation: 1261

Where is validation of KnjigaForma(request.POST, instance=knjiga) ? you need it...

from django.db.models import F
@login_required
def UnosPosudbe(request):
    if request.method == 'GET':
        forma = PosudbaForma()
    elif request.method == 'POST':
        forma = PosudbaForma(request.POST,request.FILES)
        if forma.is_valid():
            #Dohvacanje Kolicine
            kolicinaKnjige = str(forma.cleaned_data['nazivKnjige'])
            IDKnjige = kolicinaKnjige

            kolicinaKnjige = kolicinaKnjige[-1:]
            IDKnjige = IDKnjige[:1]

            unesenaKolicina = forma.cleaned_data['kolicina']
            if(int(kolicinaKnjige)>=unesenaKolicina and unesenaKolicina > 0):
                #update kolicine
                knjiga = Knjiga.objects.get(pk=IDKnjige)
                knjiga.kolicina = int(knjiga.kolicina) - int(unesenaKolicina) # This is better option (Everything happens on the database side. more safe) => knjiga.kolicina = F('kolicina') - int(unesenaKolicina)
                knjiga.save() # add save method here
                print(knjiga)
                knjiga_forma = KnjigaForma(request.POST, instance = knjiga)
                if knjiga_forma.is_valid(): # add this line
                    knjiga_forma.save()
                forma.save()
                return redirect('pregledPosudbe')
    return render(request, 'unosPosudbe.html', {'forma':forma})

and your delete view

from django.http import HttpResponseNotFound

@login_required
def deletePosudbe(request, id):
    try
        data = Posudba.objects.get(id=id)
    except Posudba.DoesNotExist:
        return HttpResponseNotFound('Resource does not exist!')
    else:
        print('data => ', data)
        print('data.__dict__ => ', data.__dict__)
        data.delete() # you can delete safe way now.
    return redirect('pregledPosudbe') 

I hope, this code will work. Good luck.

Upvotes: 1

Related Questions