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 个实例的主要内容,如果未能解决你的问题,请参考以下文章

GET请求django方式

django视图中的elif条件

如何更改 view.py 中 django-tables2 表的列标题?

在 Django 的 view.py 中创建一个新表

Django--view.py详解

如何在 django view.py 中调用远程 api?