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

如何在django-viewflow中自定义任务上下文(process_data卡片)

解决方案

针对你的三个卡点的具体建议

1. 自定义process_data数据的替代方案

除了重写模板标签,还有两种更轻量的方式:

  • 模型层面控制:在关联模型里定义get_display_fields()方法,返回需要展示的字段列表(自动排除密码哈希这类敏感字段),然后在自定义的process_data.html里直接调用这个方法,不用依赖默认的get_model_display_data。
  • 模板直接调用__str__:要把关联实例的__str__()作为标题,直接在模板里把{{ root }}替换成{{ root }}(Django模板会自动调用__str__方法),比如:
    <span class="card-title">{{ root }} #{{ process.pk }}</span>
    
  • 视图注入自定义数据:在Flow的任务视图类里,通过get_context_data注入自定义的上下文数据,避开默认的process_data逻辑:
    class MyTaskView(FlowTaskView):
        def get_context_data(self, **kwargs):
            context = super().get_context_data(**kwargs)
            # 添加自定义处理后的关联实例数据
            context['custom_process_data'] = self.object.process.get_custom_display_data()
            return context
    

2. 独立详情卡片的规范实现

Viewflow可以通过通用模板复用实现低耦合的详情卡片:

  • 先创建通用卡片模板,比如includes/model_detail_card.html,接收instance作为参数,根据模型类型动态渲染:
    {% if instance._meta.model_name == 'organisationanswer' %}
    <div class="col s12 m6 xl4">
      <div class="card blue-grey darken-1">
        <div class="card-content white-text">
          <span class="card-title">{{ instance.question.question }}</span>
          <p><strong>你的回答:</strong> {{ instance.answer }}</p>
        </div>
        <div class="card-action">
          <a href="{{ instance.absolute_admin_url }}" target="_" title="修改回答">修改回答</a>
        </div>
      </div>
    </div>
    {% elif instance._meta.model_name == 'datasetanswer' %}
    <!-- 数据集回答的卡片内容 -->
    {% endif %}
    
  • 然后在任务模板里循环关联实例时引入这个通用模板:
    {% for x in p.organisationanswer_set.all %}
        {% include 'includes/model_detail_card.html' with instance=x %}
    {% endfor %}
    
    这种方式既保持模板独立性,又避免和具体模型强绑定,后续新增模型只需在通用模板里加对应分支即可。

3. django-material formsets是否适用?

如果你的需求是在任务页面同时展示和编辑关联实例,带只读字段的django-material formsets是非常合适的方案:

  • 可以把关联模型定义为Formset,设置部分字段为只读,用Material的布局组件自定义排版,让上下文信息和主表单融合展示,不用局限在侧边栏。
  • 社区版里也可以用Django原生Formset结合django-material样式实现,专业版则提供了更便捷的嵌套Formset支持和可视化配置,能减少大量模板代码。

你的已尝试方案优化建议

  1. 可折叠process_data.html可以直接在模板里过滤敏感字段,不用重写模板标签:
    {% for name, value in fields %}
        {% if not 'password' in name.lower %}
        <dt>{{ name }}:</dt>
        <dd>
            <!-- 原有的值渲染逻辑 -->
        </dd>
        {% endif %}
    {% endfor %}
    
  2. 任务模板里的卡片可以按上面的建议重构为通用模板,降低后续维护成本。

内容的提问来源于stack exchange,提问作者florianm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:06:02