首页 > 解决方案 > 从视图更新数据库

问题描述

视图.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。

我不确定我做错了什么?

模型.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(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') 

我得到错误:

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

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

标签: djangodjango-modelsdjango-formsdjango-templatesdjango-views

解决方案


验证在哪里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') 

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


推荐阅读