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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:39:34