【问题标题】:Django admin formset : How to use jQuery adding a new row of formset?Django 管理表单集:如何使用 jQuery 添加新的表单集行?
【发布时间】:2013-02-06 11:01:00
【问题描述】:

在 django 管理添加页面中,当使用 TabularInline 时,它有一个锚点 Add another Poll,它的 html 看起来像

<a href="javascript:void(0)">Add another Poll</a>

现在我想添加一个新行,就像在触发文件输入更改事件时使用鼠标单击锚点一样:

$('input:file').change(function(e){
    //... do something ...
    var rows = "#poll_set-group .tabular.inline-related tbody tr";
    var addbtn = $(rows).parent().find("tr:last a")
    addbtn.click(); // try to add a new row but doesn't work
});

元素选择正确,但 click() 不起作用。我也试过addbtn.trigger('click'),虽然它几乎做同样的事情,但仍然不起作用。

当我追踪到 Django 的 inline.js 可以看到绑定的函数

inline.js

(function($) {
    $.fn.formset = function(opts) {
        ///...
        if ($(this).length && showAddButton) {
            var addButton;
            if ($(this).attr("tagName") == "TR") {
                //...
                addButton = $(this).parent().find("tr:last a");
            } else {
                //...
                addButton = $(this).filter(":last").next().find("a");
            }
            addButton.click(function() {
            //...
            });
        } 
    }
})(django.jQuery);

谁能告诉我为什么.click() 不起作用? 或者任何其他建议做同样的事情?

【问题讨论】:

  • 我没有找到addbtn.click() 的代码(您正在调用它但没有实现)您是否错过了要发布的内容?
  • 我认为 click() 实现在文档准备好后调用 $(rows).formset(...) 时已经绑定到 addButton.click(...。我所要做的就是触发点击事件。我的想象错了吗?

标签: jquery django django-forms django-admin


【解决方案1】:

尝试了几个小时,我发现了如何做到这一点,并在过程中学到了一些关键点。

1.使用.data在插件中存储本地对象。 (不确定是否会导致内存泄漏或任何其他问题)

内联.js
(function($) {
    $.fn.formset = function(opts) {
        ///...
        if ($(this).length && showAddButton) {
            var addButton;
            if ($(this).attr("tagName") == "TR") {
                //...
                addButton = $(this).parent().find("tr:last a");
            } else {
                //...
                addButton = $(this).filter(":last").next().find("a");
            }

            // store local object 'addButton' into data()
            var $this = $(this), data = $this.data('addButton')
            if( !data ){
                $this.data('addButton', {
                    target : addButton,
                });
            }

            addButton.click(function() {
            //...
            });
        } 
    }
})(django.jQuery);

2.jQuery对象实例存在于自己的命名空间中(本例为django.jQuery)

<script type="text/javascript">
$(document).ready(function(){
    (function($) {
        var rows1 = "#poll_set-group .tabular.inline-related tbody tr";
        $(rows1).formest({...});
    })(django.jQuery);

    var rows2 = "#poll_set-group .tabular.inline-related tbody tr";
    $(rows2).data('addButton')
    // Error, rows2's data is empty
    // cause of although rows1 & rows2 have same selector, but they are different objects in the different namespaces

    // use django.jQuery(rows2) to get the same object instance of rows1
    // this can trigger the same event handler being bound in the plugin inline.js
    django.jQuery(rows2).data('addButton').target.click(); 
});
</script>

【讨论】:

    【解决方案2】:

    addbtnaddButton 是不同的对象,因此具有不同的单击事件处理程序。您必须扩展 addButton 以添加额外的事件处理程序。此外,绑定在 DOM 上的事件已准备就绪,例如:

    $('input:file).change();
    

    仅适用于加载 DOM 时存在的元素,不会应用于该选择器的未来元素。为此,您需要使用.live()

    【讨论】:

    • 我有一些问题... 1.如果addbtnaddButton是不同的objs,为什么点击“a”会触发addButton.click? 2.我可以有一些方法来获取addButton 对象吗? 3.如何扩展jQuery插件中的本地对象addButton
    • 在仔细检查选择器时,似乎有一些重叠,这可以解释为什么您会在两个地方看到该事件。不幸的是,我并不像我希望的那样精通 JavaScript,所以我不确定如何最好地扩展 addButton
    猜你喜欢
    • 2012-01-27
    • 2020-01-22
    • 2019-04-11
    • 2013-10-27
    • 2010-12-29
    • 2017-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多