You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ViewFlow流程中数据无法存入Revisiones模型问题求助

问题分析与解决方案

看起来你踩了ViewFlow的一个常见坑:UpdateProcessView是专门用来更新流程的Process子类(也就是你的DeliveryProcess)的视图,哪怕你在自定义视图里指定了model = Revisiones,它依然会强制绑定到流程的process_class对应的模型上,所以数据自然就跑到DeliveryProcess表了。

下面是分步解决的方案:


第一步:给Revisiones模型添加流程关联字段

首先得让审核记录和具体的流程实例绑定,这样每条审核都能对应到一个流程。修改models.py里的Revisiones:

class Revisiones(models.Model):
    id_revision = models.AutoField(primary_key=True)
    # 添加外键关联DeliveryProcess,让审核记录归属到具体流程
    process = models.ForeignKey(DeliveryProcess, on_delete=models.CASCADE, related_name='revisiones')
    fecha_de_revision = models.DateField(auto_now_add=False, default=datetime.now)
    revisor = models.ForeignKey(User, on_delete=models.CASCADE, null=True, related_name='+')
    aprobacion_final = models.BooleanField(default=False)
    anadir_revisor = models.BooleanField(default=False)
    observaciones_revisor = models.TextField()

第二步:重写ReView视图,改用普通表单视图

放弃继承UpdateProcessView,改用CreateView(如果每次审核都是新建记录)结合ViewFlow的FlowViewMixin来获取流程上下文。修改views.py:

from django.views.generic.edit import CreateView
from viewflow.flow.views import FlowViewMixin
from .models import Revisiones, DeliveryProcess

class ReView(FlowViewMixin, CreateView):
    model = Revisiones
    fields = ["fecha_de_revision", "revisor", "aprobacion_final", "anadir_revisor", "observaciones_revisor"]

    def get_instance(self):
        # 创建新的审核记录,自动关联当前流程实例
        instance = Revisiones()
        instance.process = self.activation.process
        return instance

    def form_valid(self, form):
        # 保存审核记录后,同步更新流程的字段(因为流程分支依赖这些值判断跳转)
        response = super().form_valid(form)
        self.activation.process.aprobacion_final = form.cleaned_data['aprobacion_final']
        self.activation.process.anadir_revisor = form.cleaned_data['anadir_revisor']
        self.activation.process.revisor = form.cleaned_data['revisor']
        self.activation.process.save()
        return response

第三步:修正flows.py中的节点配置

调整revisor_check节点的视图调用,同时修正split节点里的拼写错误:

# flows.py
revisor_check = (
    flow.View(
        views.ReView,
        task_description="Revisar"
    ).Assign(lambda act: act.process.revisor)
    .Next(this.split)
)

split =(
    flow.Switch()
    .Case(this.end, cond=(lambda act: act.process.aprobacion_final))
    .Case(this.revisor_check, cond=(lambda act: act.process.anadir_revisor))
    # 修正拼写错误aprobacion_finale,同时调整逻辑判断
    .Case(this.ejecutar, cond=(lambda act: not act.process.aprobacion_final and not act.process.anadir_revisor))
)

为什么这样能解决问题?

  1. FlowViewMixin会自动帮我们获取当前流程的activation对象,从而拿到对应的process实例;
  2. 用普通的CreateView创建Revisiones记录,确保数据存入正确的表;
  3. 在form_valid里同步更新DeliveryProcess的字段,是因为你的流程分支跳转依赖这些字段的值,这样流程才能按预期走下去。

内容的提问来源于stack exchange,提问作者Juan David Estrada Bohorquez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:43:56