如何解决在类基视图 django 中更新数据后,信号 post_save 调用两次
所以我一直在解决这个问题,每次我按订单更新我的库存时,它都会调用两次更新我使用 Django 中内置的类基础视图,但在模型中,我有一个发布信号,它删除了产品的库存.我已经使用了 dispatch_uid
,但它不起作用,或者我在互联网上找到的任何解决方案都无法解决我的问题。
这是我要更新的类基本视图:
class ItemQtyUpdateClassBaseView(UpdateView):
template_name = 'components/update/item.html'
form_class = ItemForm
def get_context_data(self,**kwargs):
kwargs['context_title'] = 'Update Order Qty'
return super(ItemQtyUpdateClassBaseView,self).get_context_data(**kwargs)
def form_valid(self,form):
try:
order_item = OrderModel.objects.get(pk = self.kwargs[self.pk_url_kwarg])
fetch_product = ProductsModel.objects.get(product_name = order_item.product_name)
print(fetch_product.qty)
if fetch_product.dough != None:
if int(fetch_product.dough.qty) <= 0:
messages.error(self.request,'Not enough qty to order.')
return self.form_invalid(form)
if int(fetch_product.qty) <= 0:
messages.error(self.request,'Not enough qty to order.')
return self.form_invalid(form)
else:
self.object = form.save()
messages.success(self.request,'Successfully update qty.')
except Exception as e:
messages.error(self.request,e)
return self.form_invalid(form)
return super(ItemQtyUpdateClassBaseView,self).form_valid(form)
def form_invalid(self,form):
return super().form_invalid(form)
def get_queryset(self):
return OrderModel.objects.filter(pk = self.kwargs[self.pk_url_kwarg])
def get_success_url(self):
return reverse_lazy('core:createorder',kwargs = {
'typeoforder': self.kwargs['typeoforder']
})
这是我的带有信号 post_save
的模型:
class OrderModel(models.Model):
date = models.DateField(auto_now = True)
invoice_no = models.ForeignKey(InvoiceModel,on_delete = models.CASCADE)
product_name = models.CharField(max_length = 150,blank = False,null = True)
price = models.DecimalField(max_digits = 10,decimal_places = 2)
qty = models.FloatField(default = 1)
class Meta:
db_table = 'orders'
ordering = ['-pk']
@receiver(post_save,sender = OrderModel,dispatch_uid='signals.ordermodel_removeqty')
def removeQty(sender,instance = None,created = False,**kwargs):
product = ProductsModel.objects.get(product_name = instance.product_name)
if product.dough != None:
dough = DoughModel.objects.get(pk = product.dough.pk)
dough.qty = abs(dough.qty - (product.qty * instance.qty))
dough.save()
else:
product.qty = abs(product.qty - instance.qty)
product.save()
解决方法
您在 save()
方法中两次调用 form_valid()
方法:
self.object = form.save()
super(ItemQtyUpdateClassBaseView,self).form_valid(form)
您必须从 form_valid()
方法中删除以下行:
self.object = form.save()
看看 form_valid(form)
(Django Docs) 方法做了什么:
保存表单实例,设置视图的当前对象,以及 重定向到 get_success_url()。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。