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()
Ошибка:
ValueError at /UnosPosudbe/ The Knjiga could not be changed because the data didn't validate.
Я не уверен, что я делаю неправильно?
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')
Я получаю сообщение об ошибке:
TypeError at /deletePosudbe/22 'Posudba' object is not subscriptable
Я пытаюсь сделать то же самое, чтобы получить идентификатор и количество и обновить его.
Где проверка 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')
Надеюсь, этот код будет работать. Удачи.
knjiga.save()
добавлен.
Ну наконец то!! Спасибо!
Пожалуйста, но предпочтительнее использовать объект класса Django F
. Я обновил код и проверил его. Подробнее об этом читайте в будущем.
Да, конечно, вы можете, если у вас есть время, проверить мое обновление выше.
Вы добавили deletePosudbe два раза? Зачем ?
Извините, я написал неправильно, я просто добавил строку «print (data)», чтобы проверить, могу ли я получить идентификатор и количество из строки и сделать то же самое, что и раньше.
Я не вижу проблемы, но я обновил свой ответ и проверил его.
Ага, все так же: "AttributeError at /deletePosudbe/22 Объект "Посудьба" не имеет атрибута "Датум"". Может быть, что-то еще не так, но я не вижу, что, так как он работает без печати. Я могу открыть новый пост, если хотите, так как теперь это другая проблема?
Я думаю, вы показываете нам неправильный код, и проблема вообще в другом коде.
Исправил, ошибся в моделях, еще раз спасибо за все
Теперь это работает, но «knjiga.kolicina» остается таким же, как и раньше, возможно ли обновить поле базы данных таким образом или мне нужно использовать другой способ? "knjiga.kolicina = int(knjiga.kolicina) - int(unesenaKolicina)"