【问题标题】:Manually render Django form fields with variable label使用变量标签手动渲染 Django 表单字段
【发布时间】:2017-09-15 22:33:41
【问题描述】:

我正在使用以下代码创建具有动态字段(和字段名称)的表单

class BuyItemForm (forms.Form):
    def __init__(self, inventory_list,  *args, **kwargs):
        super(BuyItemForm, self).__init__(*args, **kwargs)
        for item in inventory_list:
            self.fields["count%s"%item.item_name] = forms.IntegerField()
            self.fields["price%s"%item.item_name] = forms.FloatField()

所以我得到一个表单,其中包含“counteggs”、“priceeggs”、“countmilk”等字段名称......当这些项目在 inventory_list 中时

我现在想在我的模板中手动呈现这些字段。例如,我可以遍历字段集

{% for field in form %}
{{ field }}
{% endfor %}

但我无法通过使用字符串中的字段名称来单独挑选每个字段。我试过了

{{ form.fields['counteggs'] }} 

但这不起作用。有什么想法可以让我完成这项工作吗?

【问题讨论】:

  • 您可以使用.直接访问字段检查this

标签: django forms templates variables dynamic


【解决方案1】:

你试过{{ form.fields.counteggs }} 吗?在模板中,使用点符号访问字典。

【讨论】:

  • 我可以使用 {{ form.counteggs }} 之类的东西。但是,这并不能解决问题,因为字段是在运行时动态添加到表单中的。我不知道所有字段的名称,也无法对其进行硬编码。
【解决方案2】:

所以,我找到了一种相当复杂的方法,方法是在 views.py 中创建一个过滤器,接收表单和一个键作为参数。它遍历表单,直到找到具有与键匹配的标签的字段。

@register.filter
def get_countitem(myform, key):
    for field in myform:
        if field.label.lower() == key.lower():
            return field
    return "none"

在模板中

{{ form|get_countitem:"counteggs" }}

它有效。我可以通过在字符串中传递字段标签来获取我的模板来呈现表单字段,但对我来说似乎不是一个特别优雅的解决方案。欢迎任何其他想法。

【讨论】:

    猜你喜欢
    • 2017-05-12
    • 1970-01-01
    • 2019-07-08
    • 2020-08-16
    • 2017-06-02
    • 1970-01-01
    • 2019-04-01
    • 1970-01-01
    • 2015-04-14
    相关资源
    最近更新 更多