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和数量并将其更新回来。
答案 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')
我希望这段代码可以工作。祝你好运。