Jinja for 循环与侧边栏一起使用

Jinja for loop acting up with sidebar

我正在尝试制作一个简单的 todo/task 跟踪器。我有一个显示所有任务及其相应信息的 table。我希望用户能够单击编辑并有一个侧边栏,其中包含一个允许用户编辑任务的表单。表单位于遍历任务的 for 循环内。但是,任何任务的侧边栏只显示第一个任务的信息。请在下面查看我的代码:

table id="myTable" class="table-auto border-collapse w-full" style="height: 100% !important;" >
      <thead>
        <tr class="rounded-lg text-sm font-medium font-normal text-gray-700 text-left" style="font-size: 0.9674rem; ">
          <th width="30%" id="th-sm" class="px-4 py-2 bg-gray-200" style="background-color:#FAFAFA;font-weight: 500;">Task Name <img style="display: inline-block; opacity: 0.5;" src="https://img.icons8.com/material-sharp/12/000000/sort.png"/></th>
          <th id="th-sm" class="px-4 py-2 bg-gray-200;" style="background-color:#FAFAFA;font-weight: 500;">Status/Progress <img style="display: inline-block; opacity: 0.5;" src="https://img.icons8.com/material-sharp/12/000000/sort.png"/></th>
          <th id="th-sm" class="px-4 py-2 bg-gray-200;;" style="background-color:#FAFAFA;font-weight: 500;">Due Date <img style="display: inline-block; opacity: 0.5; " src="https://img.icons8.com/material-sharp/12/000000/sort.png"/></th>
          <th id="th-sm" class="px-4 py-2 bg-gray-200 " style="background-color:#FAFAFA;font-weight: 500;">Time Logged <img style="display: inline-block; opacity: 0.5;" src="https://img.icons8.com/material-sharp/12/000000/sort.png"/></th>
          <th id="th-sm" class="px-4 py-2 bg-gray-200 " style="background-color:#FAFAFA;font-weight: 500;">Task Lead <img style="display: inline-block; opacity: 0.5;" src="https://img.icons8.com/material-sharp/12/000000/sort.png"/></th>
          <th width="auto" id="th-sm" class="px-4 py-2 bg-gray-200 " style="background-color:#FAFAFA;font-weight: 500;"></th>
        </tr>
      </thead>
      <tbody class="text-sm font-normal text-gray-700">
        {% for todo in update_todo %}
        <tr class="hover:bg-gray-100 border-b border-gray-200 py-10">
          <td class="px-4 py-4" style="font-size:1rem; font-weight: 600;" onclick="openNav_details()">{{todo['taskname']}}</td>

          <td class="px-4 py-4">
            <div class="relative pt-1">
              <div class="flex mb-2 items-center justify-between">
                <div>
                  <span class="text-xs inline-block text-gray-600">
                    {{todo['taskprogress']}}
                  </span>
                </div>
              </div>
              <div class="h-2 mb-4 text-xs flex rounded bg-gray-200">
                <div style="{{todo['taskprogress']}}" class="shadow-none flex flex-col text-center whitespace-nowrap text-white justify-center bg-gray-500"></div>
              </div>
            </div>
        </td>

          <td class="px-4 py-4">{{todo['completedate'][0:10]}}</td>
       
          <td class="px-4 py-4" >25h 18m
          </td>
        
          <td class="px-4 py-4">{{todo['assignee']}}</td>
  
          <td class="px-4 py-4">
          <div class="dropdown inline-block relative">
            <button class="text-gray-700 font-semibold py-2 px-4 rounded inline-flex items-center">
              <span class="mr-1"><img src="https://img.icons8.com/small/16/000000/more.png"/></span>
              <svg class="fill-current h-4 w-4" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20"><path d="M9.293 12.95l.707.707L15.657 8l-1.414-1.414L10 10.828 5.757 6.586 4.343 8z"/> </svg>
            </button>
            <ul class="dropdown-menu absolute hidden text-gray-700 pt-1 shadow-none" style="width: automatic !important;">
              <li class=""><a class="py-2 px-4 block" href="{{ url_for('main_bp.move_task', projectid=projectid, task_id=todo['id'], category='Complete') }}">Complete</a></li>
              <li class=""><a class="py-2 px-4 block" onclick="openNav()" href="#">Edit</a></li>
              <li class=""><a class="py-2 px-4 block" href="{{ url_for('main_bp.delete_task', projectid=projectid, task_id=todo['id']) }}">Delete</a></li>
            </ul>
          </div>
          <style>
            .dropdown:hover .dropdown-menu {
              display: block;
              background-color: white;
              width: 100% !important;
              color: #454545 !important;
              }
        </style>
        </td>

我的边栏表单

        <div id="mySidenav" class="sidenav2">
          <h2 onclick="closeNav_edit()">close</h2>
          <div class="modal-body">
          <form method="post" action="{{ url_for('main_bp.edit_task', projectid = projectid, task_id=todo['id']) }}">
            <div class="form-group">
              <h3>{{todo['taskname']}}</h3>
              <input style="display: none;" type="text" class="form-control" id="taskname" name="taskname" value="{{todo['taskname']}}">
              <input style="display: none;" type="text" class="form-control" id="taskname" name="taskcategory" value="{{todo['category']}}">
              <input style="display: none;" type="text" class="form-control" id="taskname" name="assignee" value="{{todo['assignee']}}">
              <hr>
            </div>
            <div class="form-group">
              <label for="completedate">Status/Progress</label>
              <select class="form-control" id="taskcategory" name="taskprogress" required>
                <option value="0%">0%</option>
                <option value="25%">25%</option>
                <option value="50%">50%</option>
                <option value="75%">75%</option>
                <option value="100%">100%</option>
              </select>
            </div>
            <div class="form-group">
              <label for="completedate">Due Date</label>
              <input required class="form-control" type="date" id="completedate" value="{{todo['completedate']}}"name="completedate">
            </div>
            <div class="form-group" style="display: none;">
              <label for="completedate">projectid</label>
              <input class="form-control" id="projectid" name="projectid" value="{{projectid}}">
            </div>
            <div class="form-group">
              <label for="taskcategory">Task Lead</label>
              <select class="form-control" id="taskcategory" name="assignee">
                <option value="{{todo['assignee']}}" disabled selected>{{todo['assignee']}}</option>
                {% for team_member in team_members %}
                <option value="{{team_member}}">{{team_member}}</option>
                {% endfor  %}
              </select>
            </div>
            <div class="form-group">
              <label for="taskcategory">Task Description</label>
              <textarea class="form-control" id="projectid" name="taskdescription" value="{{projectid}}">{{todo['taskdescription']}}</textarea>
              <script>
                tinymce.init({
                  selector: "textarea",
                  menubar : false,
                  statusbar:false,
                });
              </script>
            </div>
            <button type="submit" class="btn btn-primary">Submit</button>
          </form>
        </div>
        {% endfor %} 
      </tbody>
    </table>

我的 CSS 和 JS

<script>
           function openNav() {
            document.getElementById("mySidenav").style.width = "45%";
        }
        
        function closeNav_edit() {
            document.getElementById("mySidenav").style.width = "0";
        }
<script>
<style>
           .sidenav2 {
            height: 100%;
            width: 0;
            position: fixed;
            z-index: 1;
            top: 0;
            right: 0;
            background-color: white;
            overflow-x: hidden;
            transition: 0.5s;
            padding-top: 60px;
        }
        
        .sidenav2 a {
            padding: 8px 8px 8px 32px;
            text-decoration: none;
            font-size: 25px;
            color: #818181;
            display: block;
            transition: 0.3s;
        }
        
        .sidenav2 a:hover, .offcanvas a:focus{
            color: #f1f1f1;
        }
        
        .sidenav2 .closebtn {
            position: absolute;
            top: 0;
            right: 25px;
            font-size: 36px;
            margin-left: 50px;
        }
        
        @media screen and (max-height: 450px) {
          .sidenav2 {padding-top: 15px;}
          .sidenav2 a {font-size: 18px;}
        }
         </style>

所以,我想通了这个问题。对于以后遇到类似问题的人。

我必须将侧边栏 ID 设置为动态 ID。我将侧边栏 ID 设为我的任务 ID。即 {{todo.id}}。我遇到了这个问题,因为 id 是一样的。这是我的固定代码:

        <div id='{{todo.id}}' class="sidenav2">
      <h2 onclick="closeNav_edit()">close</h2>
      <div class="modal-body">
      <form method="post" action="{{ url_for('main_bp.edit_task', projectid = projectid, task_id=todo['id']) }}">
        <div class="form-group">
          <h3>{{todo['taskname']}}</h3>
          <input style="display: none;" type="text" class="form-control" id="taskname" name="taskname" value="{{todo['taskname']}}">
          <input style="display: none;" type="text" class="form-control" id="taskname" name="taskcategory" value="{{todo['category']}}">
          <input style="display: none;" type="text" class="form-control" id="taskname" name="assignee" value="{{todo['assignee']}}">
          <hr>
        </div>
        <div class="form-group">
          <label for="completedate">Status/Progress</label>
          <select class="form-control" id="taskcategory" name="taskprogress" required>
            <option value="0%">0%</option>
            <option value="25%">25%</option>
            <option value="50%">50%</option>
            <option value="75%">75%</option>
            <option value="100%">100%</option>
          </select>
        </div>
        <div class="form-group">
          <label for="completedate">Due Date</label>
          <input required class="form-control" type="date" id="completedate" value="{{todo['completedate']}}"name="completedate">
        </div>
        <div class="form-group" style="display: none;">
          <label for="completedate">projectid</label>
          <input class="form-control" id="projectid" name="projectid" value="{{projectid}}">
        </div>
        <div class="form-group">
          <label for="taskcategory">Task Lead</label>
          <select class="form-control" id="taskcategory" name="assignee">
            <option value="{{todo['assignee']}}" disabled selected>{{todo['assignee']}}</option>
            {% for team_member in team_members %}
            <option value="{{team_member}}">{{team_member}}</option>
            {% endfor  %}
          </select>
        </div>
        <div class="form-group">
          <label for="taskcategory">Task Description</label>
          <textarea class="form-control" id="projectid" name="taskdescription" value="{{projectid}}">{{todo['taskdescription']}}</textarea>
          <script>
            tinymce.init({
              selector: "textarea",
              menubar : false,
              statusbar:false,
            });
          </script>
        </div>
        <button type="submit" class="btn btn-primary">Submit</button>
      </form>
    </div>
    {% endfor %} 
  </tbody>
</table>