如何在 Django 中动态初始化 FilteredSelectMultiple

How to dynamically initialise FilteredSelectMultiple in django

我正在尝试在具有动态表单集的自定义非管理站点上使用 FilteredSelectMultiple 小部件。我已经让小部件正确显示表单集中的现有条目,方法是:

<script type="text/javascript" src="/static/admin/js/jquery.min.js"></script>
<script type="text/javascript" src="/static/admin/js/jquery.init.js"></script>
<script type="text/javascript" src="/admin/jsi18n"></script>

然而,当我在我的表单集中添加另一个条目时(我尝试使用 this plugin 并通过使用 ajax 调用表单工厂视图),小部件显示就像它是一个普通的 select 小部件,就好像初始化脚本不是 运行.

如何正确地动态初始化 FilteredSelectMultiple 小部件的更多实例?

小部件的编写方式仅在页面加载时对其进行初始化,因此您添加的其他小部件不会被初始化。处理这个问题的方法是将 link 放入 django 动态格式生成的 "added" 事件中。我认为以下代码仅在您拥有这些小部件中的一个时才有效 - 如果每个 'row' 有多个小部件,您可能必须编写一个循环来遍历这些小部件。抱歉,它不是世界上最干净的代码,但它适合我的目的:

function enableHorizFilter(row){
    /* Row contains the whole row, select only our input box.
     * This could break if there are multiple widgets like this, I think. */
    filterbox = $(".selectfilter", row);
    //Selectfilter needs the ID
    filterboxID = filterbox.attr("id");
    /* Copied params from the source of the page, might break things if
     * I change the defaults, hardcoded */
    SelectFilter.init(filterboxID, "DATACLASSHERE", 0, "/static/admin/");
}

//this adds the formset controls
$('#YOURFORMIDHERE').formset({
  //every time something is added, do the following
  added: function(row){
    enableHorizFilter(row);
  }
});