我的 select2 jquery 仅适用于第一种形式

Posted

技术标签:

【中文标题】我的 select2 jquery 仅适用于第一种形式【英文标题】:my select2 jquery only work for the first form 【发布时间】:2020-10-04 00:40:48 【问题描述】:

我想使用select2.min.js 自动完成选择(外键值),但它只适用于我的第一个表单,我使用 django formset 重复表单

这是我的sn-p

<tbody class="tbody tb1 " id="form_set">
                    
                    % for item in items.forms %
                    <tr class="p-0 col-12">
                        
                        

                        <td class="">
                            <div class="col-12 p-0 mt-3 inp">
                                <input class="col-12 0qarz qarz" type="number" name="" placeholder="qarz">
                                
                            </div>
                        </td>
                
                        <td class="">
                            <div class="col-12 p-0 mt-3 inp">
                                item.price | add_class:'col-12 '
                
                            </div>
                        </td>
                
                        <td class="">
                            <div class="col-12 p-0 mt-3 inp">    
                                item.quantity | add_class:'col-12 '
                            </div>
                        </td>
                        <td class="">
                            <div class="col-12 p-0 mt-3 inp">
                                item.model | add_class:'col-12 0model model' | attr:'id:model'
                                
                            </div>
                        </td>
                    </tr>
                    % endfor %
                </tbody>
                
<script type="text/javascript">
    $(function()
        $('.tb1 tr:last').formset(
            prefix:'items.prefix',
            addText:'add',
            deleteText:'remove',
            addCssClass:'btn btn-success',
        );
    )
</script>

<script type="text/javascript">
        $(document).ready(function()
            $("#model").select2()
        )
</script>

但 select2 仅适用于我的第一个表单,然后对其他表单没有任何影响!以及如何将表格数量设置为add_class 它可能有助于解决? 谢谢

【问题讨论】:

【参考方案1】:

首先,我希望了解更多信息,例如您如何实际定义表单集。我也不清楚你想在这里做什么。请粘贴更多数据。

我建议您考虑使用 django-select2 模块,该模块对处理 django 中的 select2 内容有很大帮助。

我也不确定您所说的“如何设置表单数量”是什么意思,也许您希望在 for/endfor 循环中包含一些可以使用 forloop 完成的增量计数器?

请贴更多的东西,答案会更好。

【讨论】:

我在我的子表单中使用了 inlineformset (parent ,child,form ,extra=1) 我有下拉外键选择,对于第一个表单 select2 工作正常,谢谢你的建议,我会试试的。 除了 django-select2,我还建议检查 django-dynamic-formset,它允许动态添加行到您的内联表单集。但是,请注意当前代码存在一些问题,因此请检查此 fork:github.com/Dowsley/django-dynamic-formset/commit/…【参考方案2】:

您用于初始化 select2 #model 的选择器用于元素 ID,对于 DOM 中的每个元素,它应该是唯一的。

在大多数浏览器中,效果将是仅识别元素 id 的第一个实例,而其余的则被忽略,就好像它们不存在一样。

在这种情况下,您想使用类选择器:.model。这将确保为所有具有“模型”类的元素初始化 select2。所以初始化 select2 的代码是:

<script type="text/javascript">
    $(document).ready(function()
        $(".model").select2()
    )
</script>

【讨论】:

你能分享一下 Loop 部分的 html 被模板引擎解析后的样子吗?这可能有助于找出问题所在。您可以从 Chrome/Firefox 中的 DevTools 或“查看页面源代码”选项中获取,如果您右键单击页面上的任意位置。 没有问题,但它提供名为 (id_sitems_set-0-model) 的默认 id 和第二个子表单 (id_sitems_set-1-model) ,也许我应该设置一个计数器,并且该类仍然保持第一种形式 你可以这样做,但我仍然认为使用一个对你想使用 select2 的每个元素都通用的类会更容易。每个表单中的该字段分配了哪些类? 谢谢我解决了***.com/a/62898342/13001893 这可行,但如果我们有多个不同名称的表单怎么办?【参考方案3】:

当其他页面出现时,您必须重新初始化(像这样: $("#model").select2();)select2。

【讨论】:

【参考方案4】:

您应该需要分别使用不同的 id 进行初始化。

例如:

<script type="text/javascript">
    $(document).ready(function()
        $("#id_1").select2();
        $("#id_2").select2();
    )
</script>

【讨论】:

【参考方案5】:

我发现的方法是通过上下文发送表单数量,然后在模板中申请循环。

views.py

get_context_data()

 context.update(
            "accessoryNum": len(StoreRequestAccessory.objects.filter(storeRequestId=self.object.pk)),
            "oneDimensionalItemNum":len(StoreRequestOneDimensionalItem.objects.filter(storeRequestId=self.object.pk)),
            "twoDimensionalItemNum":len(StoreRequestTwoDimensionalItem.objects.filter(storeRequestId=self.object.pk)), 
        )

模板.html

% block javascripts %
<script>
% comment % get accessoryNum from context % endcomment %
    var accessoryNum = accessoryNum;

$(document).ready(function()
        for(let i = 0; i <=accessoryNum; i++)
            $(`#id_storereq_accessory_form-$i-accessoryId`).select2(
                placeholder: "Select a Item",
                allowClear: true
            );
        
);

</script>

% endblock javascripts %

【讨论】:

以上是关于我的 select2 jquery 仅适用于第一种形式的主要内容,如果未能解决你的问题,请参考以下文章

显示/隐藏幻灯片的标题仅适用于第一张幻灯片

为啥单击事件处理程序仅适用于第一页

jquery .each 仅适用于第一个元素

复选框仅适用于第一页 - 数据表、导轨

jQuery ID 选择器仅适用于第一个元素

jQuery onclick仅适用于第二次点击