为 Django 生成 kwargs bootstrap_field

Generate kwargs for Django bootstrap_field

我正在尝试使用 bootstrap4 包为 Django 表单自动生成字段列表。

我正在字典中定义 kwargs,并希望遍历字段并将任何 kwargs 应用于 bootstrap4 附带的 bootstrap_field 标记。

数据

data = [
    {
        "name": "school_1",
        "args": {
            "show_label": True,
        },
    },
    {
        "name": "school_2",
        "args": {
            "show_label": False,
        },
    },
]

模板:

{% for field in form %}
    {% bootstrap_field field field|get_kwargs:data %}
{% endfor %}

模板过滤器:

from django.template.defaulttags import register
@register.filter
def get_kwargs(formfield, data):
    item = next((item for item in data if item["name"] == formfield.name), None)
    if item:
        return item.get('args'):
    return None

问题是 bootstrap_field 标签使用过滤器 returns 作为 arg,而不是 kwarg。有什么我可以做的或者我需要更换 bootstrap_field?

错误render_field() takes 1 positional argument but 2 were given

args    (<django.forms.boundfield.BoundField object at 0x10f834240>,
 {'show_label': True})
kwargs  {}

我认为 kwargs 解包在 django 模板语言中不可用。你可以做的是让你的过滤器像这样为你渲染实际字段

from django.template.defaulttags import register
from bootstrap4.templatetags.bootstrap4 import bootstrap_field


@register.filter
def get_kwargs(formfield, data):
    item = next((item for item in data if item["name"] == formfield.name), None)
    kwargs = item.get('args') or {}
    return bootstrap_field(formfield, **kwargs)

并在模板中执行

{{ field|get_kwargs:data }}

Ps:你可以将 get_kwargs 的名称更改为更有意义的名称(如 render_field