【问题标题】:Generate kwargs for Django bootstrap_field为 Django bootstrap_field 生成 kwargs
【发布时间】:2019-08-26 14:05:51
【问题描述】:

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

我在 dict 中定义 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 标记使用过滤器返回的 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  {}

【问题讨论】:

  • 试试{% bootstrap_field field kwargs=field|get_kwargs:data %}
  • @dirkgroten 它会将{'kwargs': {'key': 'value'}} 传递给bootstrap_field
  • 我很害怕。我认为不可能这样,如果我是你,我会创建一个调用 bootstrap_field 的模板过滤器,以便将数据作为 **kwargs 传递。
  • @dirkgroten 这就是我的想法。

标签: django django-bootstrap4


【解决方案1】:

我认为 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-09
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2016-01-15
    相关资源
    最近更新 更多