迭代字段时访问django形式的初始值

时间:2010-08-06 17:38:17

标签: django django-forms

我正在尝试做一些非常简单的事情;当我传入一些像这样的初始值时,我想将一个“隐藏”样式应用于django模板中的表单字段:

form = form_class(initial={'field':data})

通常,它会是这样的:

<li class="{{form.somefield.name}} {% if form.somefield.initial %} hidden{% endif %}>
    ...
</li>

但我正在迭代表单,所以我想做的事情是这样的:

{% for field in form %}
    <li class="{{field.name}} {% if field.initial %} hidden{% endif %}">
    ...
    </li>
{% endfor %}

但这不起作用,因为field.initial只将值定义为表单中字段的首字母,而不是在表单创建时传入的数据。除了将迭代分解为单独的形式之外,还有一个很好的解决方案吗?

我想到的一些(坏)解决方案:

  • 覆盖 init 将self.initial中的值填充到self.fields;
  • 编写名为{%hideifhasinitial%}
  • 的模板标签
  • 将一个方法添加到在self和self.initial上使用zip的表单(不起作用,因为self.initial只有一个元素而self有4个,它只迭代了1个元素,以及键(字段名称) )没有匹配)。

4 个答案:

答案 0 :(得分:4)

怎么样?

{% for field in form %}
    {% if field.name in field.form.initial.keys %}
        ...
    {% endif %}
{% endfor %}

答案 1 :(得分:1)

可以在value属性上访问初始数据,初始数据代表该字段的

{{field.value}}

答案 2 :(得分:0)

事实证明,有一种更简单的方法可以做到这一点。

{% if field.name in form.initial.keys %}

答案 3 :(得分:0)

带有初始键的解决方案对我没用,因为该字段包含一个空字符串作为值。我必须编写自己的自定义标记:

from django import template
register = template.Library()

@register.simple_tag
def field_empty(field):
    if not field.form.initial.get(field.name):
        return ' hidden'

    return ''

在您的示例中,我将以这种方式使用标记:

<li class="{{ field.name }} {% field_empty field %}">