Средство визуализации шаблонов Django переупорядочивает элементы div и таблицы, нарушая работу библиотеки jquery

#django

#django

Вопрос:

Я использую Django 1.6 вместе с расширением библиотеки django-formset-js для динамического изменения размеров наборов форм с помощью jQuery на стороне клиента. Эта библиотека требует, чтобы вы заключали определенные элементы ваших форм в именованные разделы.

Я ожидаю создать одну таблицу со всеми моими формами внутри нее. Согласно документации и предыдущему опыту, использование {{ form.as_table }} будет отображать форму в виде набора <tr>...</tr> строк таблицы (https://docs.djangoproject.com/en/dev/topics/forms/#form-rendering-options ).

Однако Django визуализирует HTML таким образом, что мои оберточные divs пусты и не соответствуют друг другу. Элементы div также перемещаются за пределы таблицы вместо переноса соответствующих <tr>...</tr> строк. Почему средство визуализации ведет себя таким образом с табличными формами, когда проблема не воспроизводится с {{ form.as_p }} помощью или {{ form.as_ul }} ?

Шаблон:

 <form>
  <div id="formset" data-formset-prefix="{{ view.form.prefix }}">
    <!-- .... -->      
    <table>
      <div data-formset-body="">
        {% for form in view.form %}
        <div data-formset-form="">
          {{ form.as_table }}
          <tr>
            <td>
              <button data-formset-delete-button="" type="button" >Delete form</button>
            </td>
          </tr>
        </div>
        {% endfor %}
      </div>
      <!--  .... -->     
    </table>
  </div>
</form>
  

Визуализированный HTML:

 <form>
  <div id="formset" data-formset-prefix="...">
    <div data-formset-body="">
      <div data-formset-form="">
      </div>
    </div>
    <div data-formset-form="">
    </div>
    <div data-formset-form="">
    </div>
    <table>
      <!-- all the forms end up here -->
      <tr>...</tr> 
      <tr>...</tr>           
      <tr>...</tr> 
    </table>
  </div>
</form>
  

Ответ №1:

Хорошо, на самом деле это ошибка новичка HTML с моей стороны. Я думал о <div> наборе фигурных скобок вместо элемента дерева рендеринга (которым он на самом деле является).

Проведя дальнейшие исследования, я обнаружил, что смешивание <div> и <table> является нарушением стандартов HTML и приведет к неопределенному поведению. В частности:

«При размещении div внутри таблицы важно помнить, что div должен находиться внутри определенной ячейки таблицы, то есть внутри элемента td, который находится внутри элемента tr или th». (http://css-tricks.com/using-divs-inside-tables /)

Из этого следует, что разделение Django divs из таблицы, вероятно, сделано намеренно при прохождении проверки или чем-то подобном. Кроме того, <span> ведет себя точно так же, как <div> здесь, так что это не решение.

Я могу исправить проблему, заключив каждую форму в отдельную таблицу, причем таблица полностью заключена в div. Затем шаблон преобразуется в действительный HTML и работает должным образом:

Шаблон:

 <form>
  <div id="formset" data-formset-prefix="{{ view.form.prefix }}">
    <!-- .... -->      
    <div data-formset-body="">
      {% for form in view.form %}
      <div data-formset-form="">
        <table>
          {{ form.as_table }}
          <tr>
            <td>
              <button data-formset-delete-button="" type="button" >Delete form</button>
            </td>
          </tr>
        </table>
      </div>
      {% endfor %}
    </div>
    <!--  .... -->     
  </div>
</form>