【问题标题】:how reconnect django signals after disconnected from a for loop formset与for循环表单集断开连接后如何重新连接django信号
【发布时间】:2019-07-28 20:12:09
【问题描述】:

我只想为表单集中的一个视图发送信号,我在第一个循环后断开了信号,现在我想为新视图重新连接信号

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)

模型.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() 之后放置了连接的代码,但没有像我预期的那样工作,也在函数之外仍然没有重新连接

【问题讨论】:

  • 如果您只想在一个视图中触发信号,我建议您根本没有信号并将信号中的逻辑添加到该视图中
  • 或者放入ModelForm的save方法
  • 如何从信号添加到视图?
  • 我们可以从信号本身做类似的事情吗?!

标签: python django django-signals formset


【解决方案1】:

把逻辑放在视图中

    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()  

【讨论】:

  • 不,它创建多个排序号,然后在同一个视图中保存一个新实例后,如果我们有 3 个额外的表单,它会创建 3 个不同的排序
  • 他们都应该分配相同的顺序吗?
  • 是的,为多表单创建一个订单,看看models.py
  • 更新了答案,应该做你需要的
猜你喜欢
  • 1970-01-01
  • 2011-01-13
  • 1970-01-01
  • 1970-01-01
  • 2012-08-07
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多