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

Wagtailstreamforms如何实现表单字段并排渲染及多列网格布局

Wagtailstreamforms如何实现指定表单字段并排渲染

Wagtailstreamforms是一款非常便捷的表单构建工具包,默认仅支持表单字段堆叠排列,期望实现指定字段并排渲染,效果如下:
并排字段效果
如上所示,姓名与邮箱、项目周期与预算字段分别在同一行并排展示。需要在Wagtailstreamforms表单构建器设置页中选择任意两类字段实现并排布局。

补充说明

目前Wagtailstreamforms仅支持字段上下堆叠排列,表单构建页没有提供多列网格布局的相关功能。计划通过wagtailstreamforms_fields.py的register装饰器自定义新字段,设置left、right两个选项,每个选项为可选字段列表(排除当前字段本身),让用户可以选择两个字段实现两列并排布局。
目前已初步实现带left、right选项的自定义字段,代码如下:

# wagtailstreamforms_fields.py

from django import forms
from wagtail.core import blocks
from wagtail.core.fields import StreamField
from wagtailstreamforms import streamfield
from wagtailstreamforms.fields import BaseField, register

form_field_list_left = streamfield.FormFieldStreamBlock('form_two_columns_left')
form_field_list_right = streamfield.FormFieldStreamBlock('form_two_columns_left')

@register('two_columns')
class TwoColumns(BaseField):
    field_class = forms.MultiValueField
    widget = forms.MultiWidget
    icon = 'list-ul'
    label = 'Two Columns'

    def get_form_block(self):
        return blocks.StructBlock([
            ('left', form_field_list_left),
            ('right', form_field_list_right),
        ], icon=self.icon, label=self.label)

自定义字段的配置页效果如下:
带左右选项的自定义字段
当前问题:如何在模板中获取left、right两个选项的内容?如果两列字段功能可以正常运行,后续还会扩展支持三列、四列布局。

补充思路:另一种网格系统实现方式

项目使用Bootstrap CSS,也可以为每个表单字段新增width参数,取值范围1-12(12代表全宽),之后在模板中将参数值拼接到容器div的CSS类中,即col-{{ field.width }}。该方案可以实现更灵活的网格尺寸,只是不如预设列宽的字段直观。

解决方案

你可以按照以下步骤实现模板层的字段渲染,同时支持后续多列扩展:

  • 自定义表单渲染模板
    首先复制wagtailstreamforms默认的表单模板到你项目的templates/wagtailstreamforms/form_block.html路径,重写字段渲染逻辑,识别你自定义的two_columns类型字段:
{% load wagtailstreamforms_tags %}

<form class="{{ form_class }}" id="{{ form_id }}" method="post"{% if form.is_multipart %} enctype="multipart/form-data"{% endif %}>
    {% csrf_token %}
    {{ form.media }}
    {% for field in form %}
        {% if field.field_type == 'two_columns' %}
            <div class="row">
                {# 渲染左列字段 #}
                <div class="col-md-6">
                    {% for left_field in field.value.left %}
                        {% include "wagtailstreamforms/field.html" with field=left_field %}
                    {% endfor %}
                </div>
                {# 渲染右列字段 #}
                <div class="col-md-6">
                    {% for right_field in field.value.right %}
                        {% include "wagtailstreamforms/field.html" with field=right_field %}
                    {% endfor %}
                </div>
            </div>
        {% else %}
            {# 原有普通字段渲染逻辑 #}
            {% include "wagtailstreamforms/field.html" with field=field %}
        {% endif %}
    {% endfor %}
    <button type="submit" class="btn btn-primary">{{ submit_button_text }}</button>
</form>
  • 适配后续多列扩展的优化方案
    如果后续要做3列、4列布局,不需要重复写多个自定义字段,直接把当前的双列字段调整为通用的网格容器字段:给网格容器新增列数选择项,可选2/3/4列,给每一列配置对应的字段流容器,模板中根据选择的列数动态生成对应的col-md-*类,比如3列就用col-md-4,4列用col-md-3即可。
  • 可选的字段级宽度方案实现(和你补充思路对应)
    如果要走单字段配置宽度的方案,只需要给所有基础字段新增width参数,字段渲染模板外层包裹<div class="col-md-{{ field.width }}">,所有字段外层套一层<div class="row">即可自动实现网格布局,不需要额外自定义容器字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:18:03