Django 在多对多字段中更改选定对象

Django 在多对多字段中更改选定对象,django,django-models,django-views,Django,Django Models,Django Views,我有一个订单模型和项目模型,具有多对多关系,但我只想对每个订单的选定项目进行更改,我如何才能做到这一点?当我获得order.items.all时,将影响订单中的所有项目 Model.py: class OrderItem(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True) item = models.ForeignKey

我有一个订单模型和项目模型,具有多对多关系,但我只想对每个订单的选定项目进行更改,我如何才能做到这一点?当我获得order.items.all时,将影响订单中的所有项目

Model.py:

class OrderItem(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
item = models.ForeignKey(Product, on_delete=models.CASCADE)
quantity = models.IntegerField(default=1)
ordered = models.BooleanField(default=False)
being_delivered = models.BooleanField(default=False)
being_delivered_date = models.DateTimeField(null=True)
Received = models.BooleanField(default=False)
Received_date = models.DateTimeField(null=True)

def __str__(self):
    return f"{self.quantity} of {self.item.product_name}"


class Order(models.Model):
   user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, blank=True, null=True)
   items = models.ManyToManyField(OrderItem)
   ordered = models.BooleanField(default=False)
   being_delivered = models.BooleanField(default=False)
   being_delivered_date = models.DateTimeField(null=True)
   Received = models.BooleanField(default=False)
   Received_date = models.DateTimeField(null=True)


def __str__(self):
    return self.user.username
Views.py

def update_to_recevied(request, id):
order_item = get_object_or_404(OrderItem, id=id)
order_item.Received = True
order_item.Received_date = timezone.now()
order_item.save()
return redirect(...)
html:

{order.items.all%中项目的%
{%endfor%}

您可以使用post表单获取所选项目,然后将其发送到views.py,然后将其作为字典重新发送到模板

我不确定是否正确理解您的目标,但是如果您只想更新所选项目,可以使用Jquery。使用复选框而不是按钮,为复选框指定id

     <input type="checkbox" id="checkbox">Received</input>
已收到
您可以检查是否选中该项目,如下所示:

  <script>
    $("#checkbox").change(function() {
       if(this.checked) {
    $.post("{% url 'update_to_recevied' item.id %}", {
    received: "True",    
    },
    });
}
 });
 </script> 

$(“#复选框”).change(函数(){
如果(选中此项){
$.post(“{%url'更新\u至\u已接收'item.id%}”{
收到:“正确”,
},
});
}
});
或者简单地使用:选中选择器

您可以在这里查看Jquery Post请求

  <script>
    $("#checkbox").change(function() {
       if(this.checked) {
    $.post("{% url 'update_to_recevied' item.id %}", {
    received: "True",    
    },
    });
}
 });
 </script>