Python Django Viewflow将变量传递到基于函数的视图

Python Django Viewflow将变量传递到基于函数的视图,python,django,workflow,django-viewflow,Python,Django,Workflow,Django Viewflow,试用一个非常简单的测试应用程序,使用基于函数的视图,而不是内置的基于类的视图。预期的想法是添加产品,然后批准(通过两种不同的视图/表格)。有两个问题我似乎无法解决: 我想将产品传递到approval视图(这样,进行审批的用户可以看到他们要审批的内容的摘要。我不知道如何做-我尝试通过flow.py中的flow.View传递product\u pk,但这会导致一个错误,如果我忽略它,则审批视图会更新所有记录,而不是当前产品。 无论是否检查了产品中的批准字段,flows.py中的flow.Ifgate

试用一个非常简单的测试应用程序,使用基于函数的视图,而不是内置的基于类的视图。预期的想法是添加产品,然后批准(通过两种不同的视图/表格)。有两个问题我似乎无法解决:

  • 我想将
    产品
    传递到approval视图(这样,进行审批的用户可以看到他们要审批的内容的摘要。我不知道如何做-我尝试通过
    flow.py中的
    flow.View
    传递
    product\u pk
    ,但这会导致一个错误,如果我忽略它,则审批视图会更新所有记录,而不是当前产品。
  • 无论是否检查了产品中的批准字段,flows.py中的
    flow.If
    gate似乎总是正确的。理想情况下,我希望批准记录在产品模型中,而不是流程模型中
  • 可能是超级基本的错误/概念我错过了-任何帮助将不胜感激

    模型中.py

    class Product(models.Model):
        name = models.CharField(max_length=30)
        quantity = models.IntegerField()
        approved = models.BooleanField(default=False)
    
        def __str__(self):
            return self.name
    
    class ProductProcess(Process):
        product = models.ForeignKey(Product, blank=True, null=True)
    
        def approved(self):
            return self.product.approved
    
    
    class ProductTask(Task):
        class Meta:
            proxy = True
    
    class ProductFlow(Flow):
        process_cls = ProductProcess
        task_cls = ProductTask
    
        start = flow.Start(start_process).Next(this.approve)
    
        approve = flow.View(approve_product).Next(this.checkapproval)
    
        checkapproval = flow.If(cond=lambda p: p.approved()) \
            .OnFalse(this.approve) \
            .OnTrue(this.end)
    
        end = flow.End()
    
    @flow_start_view()
    def start_process(request, activation):
        activation.prepare(request.POST or None,)
        form = ProductForm(request.POST or None)
    
        if form.is_valid():
            Product.objects.create(
                name = form.cleaned_data['name'],
                quantity = form.cleaned_data['quantity']
            )
            activation.done()
            return redirect('/test')
    
        return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form})
    
    @flow_view()
    def approve_product(request, activation):
        activation.prepare(request.POST or None,)
        form = ApproveProductForm(request.POST or None)
    
        if form.is_valid():
            Product.objects.update(
                approved = form.cleaned_data['approved']
            )
            activation.done()
            return redirect('/test')
        return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form})
    
    flows.py中

    class Product(models.Model):
        name = models.CharField(max_length=30)
        quantity = models.IntegerField()
        approved = models.BooleanField(default=False)
    
        def __str__(self):
            return self.name
    
    class ProductProcess(Process):
        product = models.ForeignKey(Product, blank=True, null=True)
    
        def approved(self):
            return self.product.approved
    
    
    class ProductTask(Task):
        class Meta:
            proxy = True
    
    class ProductFlow(Flow):
        process_cls = ProductProcess
        task_cls = ProductTask
    
        start = flow.Start(start_process).Next(this.approve)
    
        approve = flow.View(approve_product).Next(this.checkapproval)
    
        checkapproval = flow.If(cond=lambda p: p.approved()) \
            .OnFalse(this.approve) \
            .OnTrue(this.end)
    
        end = flow.End()
    
    @flow_start_view()
    def start_process(request, activation):
        activation.prepare(request.POST or None,)
        form = ProductForm(request.POST or None)
    
        if form.is_valid():
            Product.objects.create(
                name = form.cleaned_data['name'],
                quantity = form.cleaned_data['quantity']
            )
            activation.done()
            return redirect('/test')
    
        return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form})
    
    @flow_view()
    def approve_product(request, activation):
        activation.prepare(request.POST or None,)
        form = ApproveProductForm(request.POST or None)
    
        if form.is_valid():
            Product.objects.update(
                approved = form.cleaned_data['approved']
            )
            activation.done()
            return redirect('/test')
        return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form})
    
    视图中.py

    class Product(models.Model):
        name = models.CharField(max_length=30)
        quantity = models.IntegerField()
        approved = models.BooleanField(default=False)
    
        def __str__(self):
            return self.name
    
    class ProductProcess(Process):
        product = models.ForeignKey(Product, blank=True, null=True)
    
        def approved(self):
            return self.product.approved
    
    
    class ProductTask(Task):
        class Meta:
            proxy = True
    
    class ProductFlow(Flow):
        process_cls = ProductProcess
        task_cls = ProductTask
    
        start = flow.Start(start_process).Next(this.approve)
    
        approve = flow.View(approve_product).Next(this.checkapproval)
    
        checkapproval = flow.If(cond=lambda p: p.approved()) \
            .OnFalse(this.approve) \
            .OnTrue(this.end)
    
        end = flow.End()
    
    @flow_start_view()
    def start_process(request, activation):
        activation.prepare(request.POST or None,)
        form = ProductForm(request.POST or None)
    
        if form.is_valid():
            Product.objects.create(
                name = form.cleaned_data['name'],
                quantity = form.cleaned_data['quantity']
            )
            activation.done()
            return redirect('/test')
    
        return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form})
    
    @flow_view()
    def approve_product(request, activation):
        activation.prepare(request.POST or None,)
        form = ApproveProductForm(request.POST or None)
    
        if form.is_valid():
            Product.objects.update(
                approved = form.cleaned_data['approved']
            )
            activation.done()
            return redirect('/test')
        return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form})
    

    所调用的表单是一个非常基本的ModelForm类,URL与GitHub项目页面上的演示应用程序中描述的完全相同。模板具有
    {activation.management\u form}
    标记。

    首先,您需要链接产品和流程。因此,在开始视图中,您可以执行以下操作

    if form.is_valid():
        product = Product.objects.create(
            name = form.cleaned_data['name'],
            quantity = form.cleaned_data['quantity']
        )
        activation.process.product = product
        activation.done()
    
    或者更好,如果ProductForm是ModelForm

    if form.is_valid():
        product = form.save()
        activation.process.product = product
        activation.done() # here is new process instance created and saved to db
    
    因此,approval视图可以重写为:

    @flow_view()
    def approve_product(request, activation):
        activation.prepare(request.POST or None,)
        form = ApproveProductForm(request.POST or None, instance=activation.process.product)
    
        if form.is_valid():
            form.save()  # here is the approved field is updated
            activation.done()
            return redirect('/test')
        return render(request, 'viewflowtest/product.html', {'activation': activation, 'form': form})
    
    此外,您还可以使用基于函数的视图查看viewflow示例-

    Kickass!:)非常感谢您提供了超级快速的答案(希望我能够在不发布任何问题的情况下完成viewflow的其余部分!)顺便说一句,到目前为止,该应用程序看起来棒极了