从for循环表单集断开连接后如何重新连接django信号
how reconnect django signals after disconnected from a for loop formset
我只想为表单集中的一个视图发送信号,我在第一个循环后断开了信号,现在我想为新视图重新连接信号
views.py
def ProductOrderCreate(request):
if request.method=='GET':
formset = ProductFormSet(request.GET or None)
elif request.method=='POST':
formset = ProductFormSet(request.POST)
if formset.is_valid():
for form in formset:
product = form.cleaned_data.get('product')
quantity = form.cleaned_data.get('quantity')
ProductOrder(product=product ,
quantity=quantity).save()
signals.pre_save.disconnect(create_order_instance,sender=ProductOrder)
return redirect('/orders/')
return render(request , 'create_product_order.html' ,
{'forms':formset})
信号
@receiver(pre_save , sender=ProductOrder)
def create_order_instance(sender, instance, **kwargs):
Order.objects.create()
pre_save.connect(create_order_instance,sender=ProductOrder)
@receiver(pre_save,sender=ProductOrder)
def create_ordering(sender,instance,**kwargs):
if not instance.ordering:
instance.ordering = Order.objects.order_by('-pk')[0]
pre_save.connect(create_ordering,sender=ProductOrder)
models.py
class Product(models.Model):
name = models.CharField(max_length=50)
price = models.PositiveIntegerField(default=1)
def __str__(self):
return self.name
class Order(models.Model):
id = models.AutoField(primary_key = True)
products = models.ManyToManyField(Product ,through='ProductOrder')
@property
def total(self):
return self.productorder_set.aggregate(
price_sum=Sum(F('quantity') * F('product__price'),
output_field=IntegerField()) )['price_sum']
class ProductOrder(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE,default='' )
ordering = models.ForeignKey(Order,
on_delete=models.CASCADE,blank=True,null=True)
quantity = models.IntegerField(default=1)
forms.py
class ProductOrdering(forms.ModelForm):
class Meta:
model = ProductOrder
fields = ['product','ordering','quantity']
ProductFormSet = formset_factory(ProductOrdering , extra=2)
现在,我想为下一个视图重新连接信号
我应该把这段代码放在哪里
signals.pre_save.connect(create_order_instance,sender=ProductOrder)
我将连接的代码放在 render() 之后,但没有像我预期的那样工作,而且在函数之外仍然没有重新连接
将逻辑放在视图中
ordering = Order.objects.create()
for form in formset:
product = form.cleaned_data.get('product')
quantity = form.cleaned_data.get('quantity')
ProductOrder(
product=product,
quantity=quantity,
ordering=ordering
).save()
我只想为表单集中的一个视图发送信号,我在第一个循环后断开了信号,现在我想为新视图重新连接信号
views.py
def ProductOrderCreate(request):
if request.method=='GET':
formset = ProductFormSet(request.GET or None)
elif request.method=='POST':
formset = ProductFormSet(request.POST)
if formset.is_valid():
for form in formset:
product = form.cleaned_data.get('product')
quantity = form.cleaned_data.get('quantity')
ProductOrder(product=product ,
quantity=quantity).save()
signals.pre_save.disconnect(create_order_instance,sender=ProductOrder)
return redirect('/orders/')
return render(request , 'create_product_order.html' ,
{'forms':formset})
信号
@receiver(pre_save , sender=ProductOrder)
def create_order_instance(sender, instance, **kwargs):
Order.objects.create()
pre_save.connect(create_order_instance,sender=ProductOrder)
@receiver(pre_save,sender=ProductOrder)
def create_ordering(sender,instance,**kwargs):
if not instance.ordering:
instance.ordering = Order.objects.order_by('-pk')[0]
pre_save.connect(create_ordering,sender=ProductOrder)
models.py
class Product(models.Model):
name = models.CharField(max_length=50)
price = models.PositiveIntegerField(default=1)
def __str__(self):
return self.name
class Order(models.Model):
id = models.AutoField(primary_key = True)
products = models.ManyToManyField(Product ,through='ProductOrder')
@property
def total(self):
return self.productorder_set.aggregate(
price_sum=Sum(F('quantity') * F('product__price'),
output_field=IntegerField()) )['price_sum']
class ProductOrder(models.Model):
product = models.ForeignKey(Product, on_delete=models.CASCADE,default='' )
ordering = models.ForeignKey(Order,
on_delete=models.CASCADE,blank=True,null=True)
quantity = models.IntegerField(default=1)
forms.py
class ProductOrdering(forms.ModelForm):
class Meta:
model = ProductOrder
fields = ['product','ordering','quantity']
ProductFormSet = formset_factory(ProductOrdering , extra=2)
现在,我想为下一个视图重新连接信号
我应该把这段代码放在哪里
signals.pre_save.connect(create_order_instance,sender=ProductOrder)
我将连接的代码放在 render() 之后,但没有像我预期的那样工作,而且在函数之外仍然没有重新连接
将逻辑放在视图中
ordering = Order.objects.create()
for form in formset:
product = form.cleaned_data.get('product')
quantity = form.cleaned_data.get('quantity')
ProductOrder(
product=product,
quantity=quantity,
ordering=ordering
).save()