【问题标题】:Django multiple HTML forms jquery selectorDjango 多个 HTML 表单 jquery 选择器
【发布时间】:2024-05-23 03:00:02
【问题描述】:

所以我有一些模板逻辑,它为我传递的字典中的每个键创建一个 HTML 表单:

{%if students%}

                    {%for data,student in students.iteritems%}

                        <form  onsubmit = "return false;" id="{{forloop.counter}}">
                            {% csrf_token %}

                            <tr>
                            <td>{{student.name}}</td>
                            {%ifequal student.grade ' '%}
                                <td><input type=text  size="1"  id ='Grade'     name='Grade' maxlength="1" /></td>
                                <td><input type=text  size="50" id = 'Feedback' name='Feedback' /></td>

                            {%else%}
                                <td><input type=text  size="1"  id ='Grade' name='Grade' maxlength="1" value = "{{student.grade}}"/></td>
                                <td><input type=text  size="50" id = 'Feedback' name='Feedback' value = "{{student.feedback}}"/></td>

                            {%endifequal%}
                                <td><button type='submit' class="radius button success medium" onclick=submitGrade("{{forloop.counter}}")>Save</button></td>
                                <td><img src="{% static "img/check.png" %}"></td>
                                <td><input type=hidden id = 'email' name = "email" value = "{{student.email}}"></td>
                            </tr>
                        </form>

                    {%endfor%}
                    </form>
            {%endif%}

这将创建 n 个表单,第一个表单的 id 为 1,第二个为 2,。 . .,第 n 个是 n。现在,当我在 chrome 中打开 javascript 控制台并尝试执行 $('#1') 时,它返回的是 [&lt;form onsubmit=​"return false;​" id=​"1"&gt;​&lt;/form&gt;​]。出于某种原因,&lt;input&gt; 没有与表单关联。当我尝试从 javascript 控制台运行 $('#Grade') 时,它显示 [&lt;input type=​"text" size=​"1" id=​"Grade" name=​"Grade" maxlength=​"1" value=​"A"&gt;​] 这是我希望为第一个表单的 Grade 输入呈现的内容。为什么输入字段不与各自的表单关联?

【问题讨论】:

    标签: jquery html django forms


    【解决方案1】:

    ID 应该是唯一的。看起来您没有在 &lt;input&gt; id 中使用 forloop.counter。这意味着您的for 循环正在复制id="Grade"id="feedback" 作为每个表单的输入ID。此外,使用 JQuery 选择 ID 只会处理找到的 ID 的第一个实例,除非它是通过 .find() 捕获的 - 即 $('#form1').find('input[id="1"]')

    例子:

    &lt;td&gt;&lt;input type=text size="1" id ='Grade' name='Grade' maxlength="1" /&gt;&lt;/td&gt;

    应该是:

    &lt;td&gt;&lt;input type=text size="1" id ='Grade{{forloop.counter}}' name='Grade' maxlength="1" /&gt;&lt;/td&gt;

    id="feedback" 也是如此

    ////////

    另外,使用命名 id 可能会更好一些,例如:

    &lt;form onsubmit = "return false;" id="{{forloop.counter}}"&gt;

    会更适合:

    &lt;form onsubmit = "return false;" id="form{{forloop.counter}}"&gt;

    所以 id 将通过写入 $('#form1')$('#form2') 或等来捕获...

    【讨论】:

    • 嘿,我按照你的要求做了,但这并不能解决问题。我在想,出于某种原因,模板标签与 jquery 混淆了
    • 您尝试过:$('#2').find('#Grade')(使用您的代码)还是$('#form2').find('#grade2')(使用我的代码)?
    • 是的,$('#form2').find('#grade2') 返回 []
    • 您是否在ifelse 语句输入ID 中都添加了forloop.counter
    • 另外,您的 html 文件末尾似乎有一个额外的 &lt;/form&gt; 标记 - 如果没有开始标记,请删除它。