从视图更新数据库

时间:2019-05-30 19:13:33

标签: django django-models django-forms django-templates django-views

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})  

我正在尝试使用部分代码来更新数据库,但是我一直收到错误消息:

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() 

错误:

  

/ UnosPosudbe /处的ValueError无法更改Knjiga,因为   数据无效。

我不确定自己在做什么错吗?

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)

-----更新----

一切都可以解决上述问题。 但是现在,当我删除创建的行时,我想做的是使它返回到我的“ knjiga.kolicina”。

删除方式如下:

@login_required def deletePosudbe(请求,ID):     数据= Posudba.objects.get(id = id)

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

print(kolicinaKnjige)
print(IDKnjige)

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

我收到错误消息:

  

/ deletePosudbe / 22'Posudba'对象中的TypeError不能下标

我试图做同样的事情以获取ID和数量并将其更新回来。

1 个答案:

答案 0 :(得分:1)

KnjigaForma(request.POST, instance=knjiga)的验证在哪里?你需要它...

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})

和您的删除视图

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') 

我希望这段代码可以工作。祝你好运。