view.py 中的 Django Form If 条件与 2 个实例
Posted
技术标签:
【中文标题】view.py 中的 Django Form If 条件与 2 个实例【英文标题】:Django Form If condition in view.py with 2 instance 【发布时间】:2020-11-12 13:36:10 【问题描述】:为了保存在 Django 中以表格形式输入的数据,我试图让它像这样 我把它放在我的model.py中
class Item(models.Model):
CATEGORY = (
('Gudang Kering', 'Gudang Kering'),
('Gudang Basah','Gudang Basah'),
)
name = models.CharField(max_length=200,null= True)
stock = models.IntegerField(default='0', blank=False, null=True)
category = models.CharField(max_length=200,null= True,choices=CATEGORY)
reorderlevel = models.IntegerField(default='0', blank=False, null=True)
maxreorderlevel = models.IntegerField(default='0', blank=False, null=True)
description = models.CharField(max_length=200,null= True, blank= True)
date_created = models.DateTimeField(auto_now_add= True)
tags = models.ManyToManyField(Tag)
def __str__(self):
return self.name
class Issue(models.Model):
STATUS = (
('Pending', 'Pending'),
('Granted','Granted'),
('Denied','Denied'),
)
customer = models.ForeignKey(Customer, null=True, on_delete= models.SET_NULL)
item = models.ForeignKey(Item, null=True, on_delete= models.SET_NULL)
quantity = models.IntegerField(default='0', blank=False, null=True)
date_created = models.DateTimeField(auto_now_add=True, auto_now=False)
status = models.CharField(max_length=200,null= True, choices=STATUS)
然后在 view.py 我定义这样的形式
def updateIssue(request, pk):
issue = Issue.objects.get(id=pk)
item = Item.objects.all()
form = UpdateIssueForm(instance=issue)
if request.method == 'POST':
form = UpdateIssueForm(request.POST,instance=issue)
#print ('printing:',request.POST)
if form.is_valid():
instance = form.save(commit=False)
if instance.status == 'Granted':
item.stock -= instance.quantity
instance.save()
item.save()
else:
instance.save()
return redirect('/')
context = 'form':form
return render(request,'accounts/issue_form.html',context)``
目标 如果实例 == “授予” item.stock 将减少 instance.quantity 的数量 并将被保存。 其他 实例只会被保存而不影响第二个模型的库存
错误
item = Item.objects.all()
即使当我在数据库中为该表输入数据时,即使调用 item.stock 时也有 0 属性
【问题讨论】:
是这里显示的issue_items()
与您的视图代码中的相同.. 有一些拼写错误
修复了对象的错别字
if 语句缩进不正确之后
新错误是现在我调用的 item.stock 没有属性,即使我首先使用 `item = item.objects.all()``跨度>
【参考方案1】:
不需要获取Item
,因为我们可以使用Issue
对象(如issue.item
)访问与Issue
相关的Item
。这只是docs的一个例子:
文章模型有一个字段报告者,它是与报告者模型相关的外键。使用 Article 对象访问 Reporter 对象。
>>> new_article = r.article_set.create(headline="John's second story", pub_date=date(2005, 7, 29))
>>> new_article
<Article: John's second story>
>>> new_article.reporter
<Reporter: John Smith>
>>> new_article.reporter.id
1
像这样,我们可以使用Issue
访问Item
def updateIssue(request, pk):
issue = Issue.objects.get(id=pk) # we have our Issue here
form = UpdateIssueForm(instance=issue)
if request.method == 'POST':
form = UpdateIssueForm(request.POST,instance=issue)
if form.is_valid():
instance = form.save(commit=False)
if instance.status == 'Granted':
issue.item.stock -= instance.quantity # access Item by using Issue object's related field with name item
issue.item.save() # save the Item first
instance.save() # then the Issue
else:
instance.save()
return redirect('/')
context = 'form':form
return render(request,'accounts/issue_form.html',context)
【讨论】:
以上是关于view.py 中的 Django Form If 条件与 2 个实例的主要内容,如果未能解决你的问题,请参考以下文章