首页 > 解决方案 > Django 模板标签和元编程:有没有办法在调用它的上下文之前修改变量的名称?

问题描述

假设在views.py 中,我的上下文中有一个可变(即,不断变化的)数量的形式或对象类型。(为简单起见,我将仅使用“表格”一词)。

context = {
     'form_0': form_0,
     'form_1': form_1,
     'form_2': form_2,
     'form_3': form_3,
     # ... and so forth
}

假设我无法知道在任何给定时间我的上下文中有多少表格。是否可以使用模板标签执行以下操作:

{% for i in (number of forms in context) %}

{{ form_i }} <-- where i is equal to the number i in the loop -->

{% endfor %}

在这里,最终结果将转化为:

{{ form_0 }}
{{ form_1 }}
{{ form_2 }}
... and so forth

我怀疑这是否可能,但如果是的话,我会发现它很有帮助。

标签: djangodjango-templatesmetaprogramming

解决方案


按名称引用,如在构造包含名称的字符串时,通常被认为是一种不安全的方法:它可能比人们想象的更难构建正确构造名称的算法。Forthermore 说你这样做了,然后 remove form_3,那么你的算法可能会停在2,但也许那里还有其他形式,但是你忘记了获取形式的算法。

最好在这里传递对象集合,例如list

context = {
    'forms': [form_0, form_1, form_2, form_3]
}

然后我们可以在模板中渲染它:

{% for form_i in forms %}
    {{ form_i }}
{% endfor %}

如果您因此向列表中添加一个额外的表单,那么该表单将成为模板中迭代的一部分,因此 Django 将呈现该表单(或您放入列表中的任何内容)。

如果您还需要访问某些特定表单,您也可以通过另一个名称传递,例如:

context = {
    'forms': [form_0, form_1, form_2, form_3],
    # if we need specific items of form_2 in the template,
    # we can pass it under a specific name as well
    'form_2': form_2
}

所以现在我们都可以枚举forms来渲染这些,但是如果form_2有一些我们需要在模板中处理的有趣数据,我们仍然可以使用{{ form_2.non_field_errors }}例如。


推荐阅读