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)) )
为什么这样能解决问题?
FlowViewMixin会自动帮我们获取当前流程的activation对象,从而拿到对应的process实例;- 用普通的
CreateView创建Revisiones记录,确保数据存入正确的表; - 在
form_valid里同步更新DeliveryProcess的字段,是因为你的流程分支跳转依赖这些字段的值,这样流程才能按预期走下去。
内容的提问来源于stack exchange,提问作者Juan David Estrada Bohorquez
相关产品推荐
相关产品推荐

