如何在Django-ViewFlow任务提交表单时收集特定任务备注?
嘿,这个需求其实挺常见的——在ViewFlow的不同审批/处理步骤收集对应人员的备注,我来给你捋个清晰的实现思路和代码示例:
实现Django-ViewFlow多任务步骤的备注收集
首先,我们需要一个单独的模型来存储每个任务的备注,这样不会把流程模型(Process)搞得字段臃肿,还能清晰关联到具体任务和操作人。
1. 创建任务备注模型
先在你的models.py里定义一个TaskNote模型,用来记录每个任务的备注信息:
from django.db import models from viewflow.models import Process, Task class TaskNote(models.Model): process = models.ForeignKey(Process, on_delete=models.CASCADE, related_name="task_notes") task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name="notes") note_text = models.TextField(verbose_name="备注内容") created_by = models.ForeignKey("auth.User", on_delete=models.SET_NULL, null=True, blank=True) created_at = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = "任务备注" verbose_name_plural = "任务备注" def __str__(self): return f"{self.task.flow_task.name} - {self.created_by.username if self.created_by else '匿名'} 备注"
2. 自定义带备注收集的视图类
接下来,我们需要扩展ViewFlow的默认视图,让它能处理备注字段的提交和保存。这里以UpdateProcessView为例,创建一个带备注的基类视图:
from viewflow.views import UpdateProcessView from django.views.generic.edit import FormMixin from .models import TaskNote class ProcessViewWithNote(UpdateProcessView, FormMixin): # 添加备注字段到表单 note_fields = ["note_text"] def get_form(self, form_class=None): # 合并流程字段和备注字段的表单 form = super().get_form(form_class) # 动态添加备注字段 from django import forms form.fields["note_text"] = forms.CharField( widget=forms.Textarea(attrs={"rows": 3}), required=False, # 可选备注,根据需求改成True label="备注" ) return form def form_valid(self, form): # 先保存流程模型的更新 response = super().form_valid(form) # 保存备注到TaskNote模型 note_text = form.cleaned_data.get("note_text") if note_text: TaskNote.objects.create( process=self.process, task=self.request.current_task, # ViewFlow会把当前任务放到request里 note_text=note_text, created_by=self.request.user ) return response
3. 在流程中配置各任务步骤
现在就可以用这个自定义视图替换原来的UpdateProcessView,给每个任务步骤加上备注收集功能:
启动环节(Task1)
启动环节一般用CreateProcessView,我们可以类似扩展一个带备注的创建视图:
from viewflow.views import CreateProcessView class CreateProcessViewWithNote(CreateProcessView, FormMixin): def get_form(self, form_class=None): form = super().get_form(form_class) from django import forms form.fields["note_text"] = forms.CharField( widget=forms.Textarea(attrs={"rows": 3}), required=True, # 启动环节强制要备注 label="提交备注" ) return form def form_valid(self, form): response = super().form_valid(form) note_text = form.cleaned_data.get("note_text") if note_text: # 启动环节的任务是流程的第一个任务,我们可以通过process获取 task = self.process.task_set.first() TaskNote.objects.create( process=self.process, task=task, note_text=note_text, created_by=self.request.user ) return response # 流程里的启动环节配置 start = ( flow.Start(CreateProcessViewWithNote, fields=["process_title", ...]) # 替换成你的流程字段 .Permission(lambda process: 'core.can_start_process') .Next(this.verify_task) )
验证环节(Task2)和审批环节(Task3)
直接用我们之前定义的ProcessViewWithNote,替换原来的UpdateProcessView,并指定字段:
# 验证环节 verify_task = ( flow.View(ProcessViewWithNote, fields=["is_verified"], task_title="验证文档") .Permission(lambda process: 'core.can_verify') .Next(this.approve_task) ) # 审批环节(基于你原来的示例修改) approve_task = ( flow.View(ProcessViewWithNote, fields=["is_approved"], task_title="审批文档") .Permission(lambda process: 'core.can_approve_{}'.format(process.process.type)) .Next(this.check_approve) )
4. 查看备注(可选)
如果需要在流程详情页展示各步骤的备注,可以在Process的模板里遍历process.task_notes.all(),比如:
{% for note in process.task_notes.all %} <div class="note-item"> <strong>{{ note.created_by.username }} ({{ note.created_at|date:"Y-m-d H:i" }})</strong> <p>{{ note.note_text|linebreaks }}</p> <small>步骤:{{ note.task.flow_task.name }}</small> </div> {% empty %} <p>暂无备注</p> {% endfor %}
这样每个任务步骤提交表单时,就能收集对应操作人的备注,而且所有备注都和具体任务、流程关联,管理起来非常清晰。
内容的提问来源于stack exchange,提问作者Asif
相关产品推荐
相关产品推荐

