【问题标题】:Django Viewflow passing variables to function based viewDjango Viewflow 将变量传递给基于函数的视图
【发布时间】:2016-03-24 08:06:59
【问题描述】:

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

  1. 我想将Product 传递给批准视图(以便进行批准的用户可以看到他们要批准的内容的摘要。我不知道该怎么做 - 我尝试通过 @987654323 @ 通过flows.py 中的flow.View,但这会导致错误,如果我将其忽略,那么审批视图会更新所有记录而不是当前产品。
  2. flows.py 中的flow.If 门似乎始终为 True,无论 Product 中的已批准字段是否已被检查。理想情况下,我希望批准记录在产品模型而不是流程模型中

可能是我缺少的超级基本错误/概念 - 任何帮助将不胜感激。

models.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

flows.py

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

views.py

@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_form }} 标签。

【问题讨论】:

    标签: python django workflow django-viewflow


    【解决方案1】:

    首先,您需要将产品和流程联系起来。所以在开始视图中,你可以这样做

    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
    

    所以审批视图可以改写为::

    @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})
    

    此外,您可以查看基于函数的视图的视图流示例 - https://github.com/viewflow/cookbook/blob/master/viewflow_customization/customization/parcel/views.py

    【讨论】:

    • 太棒了! :) 非常感谢您的超级快速回答(希望我能够在不针对每个障碍发布问题的情况下解决 Viewflow 的其余部分!)顺便说一句,该应用程序看起来很棒
    猜你喜欢
    • 2013-08-16
    • 2017-06-02
    • 2016-03-26
    • 1970-01-01
    • 2019-04-23
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多