Доступ к начальному значению форм django при переборе полей

Я пытаюсь сделать что-то довольно простое; Я хотел бы применить «скрытый» стиль к полю формы внутри шаблона 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%}
  • добавление в форму метода, который использует zip для self и self.initial (не работает, поскольку в self.initial был только один элемент, а в self — 4, он перебирал только 1 элемент, а ключи (имена полей) не т совпадают).

person Community    schedule 06.08.2010    source источник


Ответы (4)


как насчет этого?

{% for field in form %}
    {% if field.name in field.form.initial.keys %}
        ...
    {% endif %}
{% endfor %}
person Community    schedule 06.08.2010

Доступ к исходным данным можно получить по атрибуту value, исходные данные представляют собой значение поля:

{{field.value}}

person Community    schedule 11.03.2017

Оказывается, есть более простой способ сделать это.

{% if field.name in form.initial.keys %}
person Community    schedule 06.08.2010

Решение с начальными ключами у меня не сработало, так как поле содержит в качестве значения пустую строку. Мне пришлось написать свой собственный тег:

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 %}">
person Community    schedule 03.02.2011