django - 从视图更新数据库
问题描述
视图.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 和数量并将其更新回来。
解决方案
验证在哪里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')
我希望,这段代码可以工作。祝你好运。
推荐阅读
- javascript - 由于 babelrc,构建失败,presets[0] [1] 必须是一个对象,false 或 undefined
- azure-application-insights - 使用 Serilog 多个接收器 ReadFrom.Configuration
- visual-studio - 如何删除视觉工作室中出现在正在编辑的单词周围的虚线?
- python - python selenium headless chromedriver在前一天工作时没有加载整页,代码没有变化
- c# - List.ToArray() 不返回任何内容 (System.Int32[])
- apache-spark - 为 spark-shell 设置默认包变量
- authentication - 无法从 mac OS 上的私有 Azure Artifact 还原 nuget 包
- hash - Redis Timeseries 数据 - 哈希和排序集中的数百万条记录
- node.js - 为什么 docker 工作目录不受影响
- javascript - MVC 中的复选框绑定