Django / Python: цикл по выбранным полям формы в шаблоне Django - PullRequest
1 голос
/ 13 декабря 2011

У меня есть форма с n полями. Первые 4 поля должны отображаться по-другому в моем шаблоне, чем остальные формы. Поэтому мне было интересно, могу ли я каким-то образом зациклить первые 4 поля, завершить цикл и продолжить зацикливание на остальных полях позже в шаблоне.

        <table>
            {% for field in form %}
            {% if forloop.counter == 4 <<< Break here >>>%}
            <tr>
                <td> {{ field.label_tag }} </td>
                <td> {{ field }} </td>
            </tr>
            {% endfor %}
        </table>
        .... Different code ....
        <table>
            {% for field in form %} <<< Continue here >>>
            <tr>
                <td> {{ field.label_tag }} </td>
                <td> {{ field }} </td>
            </tr>
            {% endfor %}
        </table>

Я нашел этот код , но мне было интересно, смогу ли я по-другому структурировать шаблон или я пропустил некоторые новые изменения в Django 1.3, которые теперь позволяют разрывать циклы.

Обычно я разделяю форму на две отдельные формы, но я хотел бы повторно использовать определение формы и в других шаблонах, поэтому я хотел бы сохранить всю информацию вместе в одной форме.

Спасибо за ваш совет!

Ответы [ 5 ]

8 голосов
/ 13 декабря 2011

Это то же решение, что и другие проблемы «не могу сделать это в шаблоне»: делайте это в представлении. Я искренне верю, что дополнительная сложность и дальнейшее разделение логики на несколько областей кода (теги, новые файлы и т. Д.) Только ухудшают возможность сопровождения. Я разделяю / внедряю СУХОЙ только тогда, когда вещи действительно становятся повторяющимися, нечитаемыми и т. Д.

Все остальное - преждевременная оптимизация.

Джанго не узнает разницу при отправке формы.

fields = list(form)    
part1, part2 = fields[:4], fields[4:]


{% for field in part1 %}{{ field }}{% endfor %}
...
{% for field in part2 %}{{ field }}{% endfor %}
2 голосов
/ 11 февраля 2014

Поскольку форма представляет собой список, вы также можете использовать встроенный фильтр шаблонов слайсов Django: https://docs.djangoproject.com/en/1.3/ref/templates/builtins/#slice

Ваш пример будет:

    <table>
        {% for field in form|slice:":4" %}
        <tr>
            <td> {{ field.label_tag }} </td>
            <td> {{ field }} </td>
        </tr>
        {% endfor %}
    </table>
    .... Different code ....
    <table>
        {% for field in form|slice:"4:" %}
        <tr>
            <td> {{ field.label_tag }} </td>
            <td> {{ field }} </td>
        </tr>
        {% endfor %}
    </table>
2 голосов
/ 13 декабря 2011

Я бы посоветовал вам написать собственный пользовательский шаблон . Возможно, ваш фильтр может выглядеть так:

def show_part(form,section=1): 
    display = ''
    for id,field in enumerate(form):  
         if int(section) == 1 and id > 3:
             break
         elif int(section) == 2 and id < 3:
             continue
         display += '<tr><td>'+field.label_tag+'</td>'
         display += '<td>'+field+'</td></tr>'
    return display    

и используйте в своем шаблоне следующее:

<table>
    {{ form|show_part:"1" }}
</table>
<table>
    {{ form|show_part:"2" }}
</table>
1 голос
/ 13 декабря 2011

Вы почти там, если вы просто добавите

<table>
{% if forloop.counter <= 4 %}
... first four fields
{% else %}
... other fields
{% endif %}

Если вам нужны две разные таблицы, вы можете добавить:

{% if forloop.counter == 1 %}
<table>
{% endif %}

{% if forloop.last %}
</table>
{% endif %}

Это не очень красивое решение, но оно работает. Вы также можете рассмотреть возможность использования двух форм.

0 голосов
/ 09 октября 2014

Короче, чем ответ "Yuji 'Tomita' Tomita"

Составьте список для формы на ваш взгляд:

context = {'form': list(form)}
return render(request, template, context)

и получить каждое поле в шаблоне с помощью | slice

{% for field in form|slice:":4" %}
    <tr>
        <td> {{ field.label_tag }} </td>
        <td> {{ field }} </td>
    </tr>
{% endfor %}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...