首页 > 解决方案 > 如何在 django 模板(for 循环)和 jquery 中创建多个日期时间选择器

问题描述

我无法让 django 在 html 页面的选项卡中显示多个日期时间选择器。如果我在循环之外指定 jquery 中的每个元素,我可以让它们工作,但是当我把它放在循环中时,它们不会显示(只显示一个空的输入文本框)。由于这必须在不同大小的数组上完成(最小长度为 1 且没有最大值),因此我无法对每个单独的 datetimepicker 进行硬编码。django 模板 html 页面上的 for 循环有效,并且每个选项卡和 datetimepickers 所在的部分都已制作,但 jquery 不起作用。

我试图通过一个循环来制作 4 个 datetimepicker(每个选项卡 4 个,可以有 1 个以上的选项卡),并且它们不会创建 datetimepicker 对象。只需创建一个输入文本框。

我还尝试将它们全部放入一个 class=datetimepicker 中,这确实有效,但是我无法从数组中添加默认数据来填充每个 datetimepicker,因为 jquery 中唯一的函数是一个调用 class 的函数。日期时间选择器。尝试 $('#date1').datetimepicker({ defaultDate: array[counter][0] }) 在数组中填充 date1 datetimepicker 的每个选项卡,但这也不起作用。

不包括通常的 django 模板代码,只是放入不起作用的部分:

------------------- template html ------------------------

{% if entryList %}
  <ul id="tab_links" class="nav nav-tabs justify-content-center">
    {% for entry in entryList %}
      {% if forloop.first %} <!-- won't go through the first iteration otherwise -->
        <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab_{{forloop.counter0}}">{{entry.0}}</a></li>
      {% else %}
        <li class="nav-item"><a class="nav-link" data-toggle="tab" href="#tab_{{forloop.counter0}}">{{entry.0}}</a></li>
      {% endif %}
    {% endfor %}
  </ul>

  <div id="tab_content" class="tab-content">
    {% for entry in entryList %}
      {% if forloop.first %}
        <div id="tab_{{forloop.counter0}}" class="tab-pane fade in active">
          <table cellspacing="10" cellpadding="10">
            <tr>
              <td> date1: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
            <tr>
              <td> date2: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
            <tr>
              <td> date3: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
            <tr>
              <td> date4: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
          </table>
        </div>
       {% else %}
         <div id="tab_{{forloop.counter0}}" class="tab-pane fade">
           <table cellspacing="10" cellpadding="10">
             <tr>
              <td> date1: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
            <tr>
              <td> date2: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
            <tr>
              <td> date3: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
            <tr>
              <td> date4: </td>
              <td style="position:relative">
                <input class="datetimepicker" type="text" id="date_{{forloop.counter0}}" name="date_{{forloop.counter0}}" "> 
              </td>
                <!-- other input like txt boxes or drop down menus -->
            </tr>
          </table>
        </div>
       {% endif %}
      {% endfor %}
    </div>
.
.  other data on template html
.
<script>    var numOfTabs = {{entryListLength}};
        var jsondataList = {{json_dataList|safe}};
</script>
<script src="{% static 'js/dates.js' %}"> </script>  <!-- right before /body tag -->

--------------------------------js/dates.js------------------------------

// gotta use a for loop to get all tabs
// 4 parts of the array are dates: 7 - date rec, 10 - date ret, 16 - key req date, 17 - key rec date

var count = 0;

for (count; count < numOfTabs; count++) {
    // date1
    if ((jsondataList != null) && (jsondataList.length != 0) && (jsondataList[count][7] != null) && (jsondataList[count][7].length != 0)) {
        var datearr = jsondataList[count][7].split(/-|\s|:/);
        var date1 = new Date(datearr[0], datearr[1] - 1, datearr[2], datearr[3], datearr[4], datearr[5]);
        var inName = "#date1_" + count;
        console.log('array slot : ', count, 7, date1, inName);
        $(function() {
            $(inName).datetimepicker({
                useCurrent:false,
                  format: 'YYYY-MM-DD HH:mm:ss',
                defaultDate: date1,
            });
        });
    } else {
        $(function() {
            $("#date1_" + count).datetimepicker({
              format: 'YYYY-MM-DD HH:mm:ss',
            });
        });
    }
    // date2
    if ((jsondataList != null) && (jsondataList.length != 0) && (jsondataList[count][10] != null) && (jsondataList[count][10].length != 0)) {
        var datearr = jsondataList[count][10].split(/-|\s|:/);
        var date2 = new Date(datearr[0], datearr[1] - 1, datearr[2], datearr[3], datearr[4], datearr[5]);
        var inName = "#date2_" + count;
        console.log('array slot : ', count, 10, date2, inName);
        $(function() {
            $(inName).datetimepicker({
                useCurrent:false,
                  format: 'YYYY-MM-DD HH:mm:ss',
                defaultDate: date2,
            });
        });
    } else {
        $(function() {
            $("#date2_" + count).datetimepicker({
              format: 'YYYY-MM-DD HH:mm:ss',
            });
        });
    }
// date3
    if ((jsondataList != null) && (jsondataList.length != 0) && (jsondataList[count][16] != null) && (jsondataList[count][16].length != 0)) {
        var datearr = jsondataList[count][16].split(/-|\s|:/);
        var date3 = new Date(datearr[0], datearr[1] - 1, datearr[2], datearr[3], datearr[4], datearr[5]);
        var inName = "#date3_" + count;
        console.log('array slot : ', count, 16, date3, inName);
        $(function() {
            $(inName).datetimepicker({
                useCurrent:false,
                  format: 'YYYY-MM-DD HH:mm:ss',
                defaultDate: date3,
            });
        });
    } else {
        $(function() {
            $("#date3_" + count).datetimepicker({
              format: 'YYYY-MM-DD HH:mm:ss',
            });
        });
    }
// date4
    if ((jsondataList != null) && (jsondataList.length != 0) && (jsondataList[count][17] != null) && (jsondataList[count][17].length != 0)) {
        var datearr = jsondataList[count][17].split(/-|\s|:/);
        var date4 = new Date(datearr[0], datearr[1] - 1, datearr[2], datearr[3], datearr[4], datearr[5]);
        var inName = "#date4_" + count;
        console.log('array slot : ', count, 17, date4, inName);
        $(function() {
            $(inName).datetimepicker({
                useCurrent:false,
                  format: 'YYYY-MM-DD HH:mm:ss',
                defaultDate: date4,
            });
        });
    } else {
        $(function() {
            $("#date4_" + count).datetimepicker({
              format: 'YYYY-MM-DD HH:mm:ss',
            });
        });
    }
}

The code for the class version is 

        $(function() {
            $(".datetimepicker").datetimepicker();
        });
*this works for making datetimepickers, but can't put default values in.        

预期的结果是它在页面上有选项卡,其数量等于数组/列表列表的大小,即 list[x][y] 将有 x 个选项卡。每个选项卡上都有 y 个输入变量(文本框、区域等)以及 4 个日期时间选择器。datetimepicker 应该从列表中为每个选项卡显示默认值,并且可以根据单击 datetimepicker 对象和弹出的日历来选择不同的值。

实际输出显示除日期时间选择器之外的所有内容。datetimepickers 显示为文本框,不填充默认值,并且在单击时不加载日历(就像文本框一样)。如果我将 js 作为仅作用于类本身的函数,它将生成 datetimepicker 对象,但不允许我输入默认值。

模板中的其他所有内容都有效,只是循环中的 datetimepickers 无效。现在已经尝试了几个星期来弄清楚。

编辑:

另外,需要注意的一点:如果我在循环之外创建 4 个日期时间选择器中的每一个,那么对于我创建它们的选项卡,它将起作用,但是由于我不知道我将拥有多少个选项卡,所以我必须这样做动态的,因此为什么它们在 javascript 循环中。

标签: pythonjquerydjangobootstrap-datetimepicker

解决方案


为遇到相同或类似问题的其他人找到了解决方案。我没有直接在循环中创建 datetimepicker,而是将 datetimepicker 函数从循环中分离出来,然后调用它。

IE:

for loop
    ....
    ....
    call mydatetimepicker(variable, variable)

mydatetimepicker(variable, variable) {
 code to create a datetimepicker
}

因为我一生无法让它在循环中工作,但是一旦我将它们分开,即使使用默认日期它也能正常工作。


推荐阅读