【问题标题】:Django-selectable with dynamic inlines带有动态内联的 Django 可选
【发布时间】:2011-09-01 19:32:18
【问题描述】:

我正在使用 django-selectable (https://bitbucket.org/mlavin/django-selectable) 一个管理员 tabularInline 来获得一个内联字段的自动完成功能。它适用于在创建时添加的内联。我遇到的问题是当用户将另一行添加到内联时未添加自动完成功能。

这里有一个错误和修复这个问题

https://bitbucket.org/mlavin/django-selectable/issue/12/make-it-work-with-dynamically-added-forms 查看底部附近的 jquery.dj.selectable.js 是:

if (typeof(django) != "undefined" && typeof(django.jQuery) != "undefined") {
    if (django.jQuery.fn.formset) {
        var oldformset = django.jQuery.fn.formset;
        django.jQuery.fn.formset = function(opts) {
            var options = $.extend({}, opts);
            var addedevent = function(row) {
                bindSelectables($(row));
            };
            var added = null;
            if (options.added) {
                var oldadded = options.added;
                added = function(row) { oldadded(row); addedevent(row); };
            }
            options.added = added || addedevent;
            return oldformset.call(this, options);
        };
   }
}

看起来这应该使自动完成功能与动态添加的行一起工作,但我不知道该怎么做才能工作。 管理员 tabularInline.html 有 inline_admin_formset 所以我应该检查它而不是上面代码中的 django.jQuery.fn.formset 吗?或者以某种方式将 inline_admin_formset 添加到 django.jQuery.fn ?

非常感谢您的任何建议。


我使用的是 0.2 版。 在 forms.py 中有内联表单:

    class GrammarInlineForm(forms.ModelForm):
        class Meta:
            model = Grammar
            widgets = {
            'description' :forms.Textarea(attrs={'cols': 80, 'rows': 10, 'class': 'grammarInline'}),
            'title' : selectable.AutoCompleteSelectWidget(lookup_class=GrammarLookup, allow_new=True),
        }   
        exclude = ('creation_date', 'creator', 'plan')

        def __init__(self, *args, **kwargs):
        super(GrammarInlineForm, self).__init__(*args, **kwargs)

在 admin.py 中创建内联管理员并将其添加到主管理员 (PlanAdmin):

    class GrammarInline(admin.TabularInline):
        form = GrammarInlineForm
        model = Grammar
        extra = 2

        def save_formset(self, request,form, formset, change):
            instances = formset.save(commit=False)
            for instance in instances:
                instance.creator = request.user
                instance.save()
            formset.save_m2m()

    class PlanAdmin(admin.ModelAdmin):
        form = PlanForm
        list_display = ('title', 'topic', 'level', 'description','public', )
        inlines = [ ActivityInline, GrammarInline, ]

读完你的票http://code.djangoproject.com/ticket/15760我尝试绑定到内联formsetadd事件,像这样

    django.jQuery('.ui-autocomplete-input').live('formsetadd', function(e, row) {
        console.log('Formset add!');
        console.log($(row));
       });

但是查看 django/contrib/admin/media/js/inlines.js 这些触发器似乎不在 django 的 1.3.1 版中。是否有必要绑定到添加内联时触发的事件?这里有一个类似的案例 https://bitbucket.org/mlavin/django-selectable/issue/31/dynamically-added-forms 但那是使用表单集插件。有没有办法使用 bindSelectable(row) 到管理员内联?

【问题讨论】:

  • 你不应该做任何事情来完成这项工作。你运行的是哪个版本?

标签: django dynamic autocomplete inline selectable


【解决方案1】:

您发布的jquery.dj.selectable.js 代码用于修补django/contrib/admin/media/js/inlines.js,以便在添加新行时调用bindSelectable(row)http://code.djangoproject.com/ticket/15760 已打开,因此这个猴子补丁不是必需的,但尚未关闭,可能不会在 Django 1.4 中关闭。同样,您不需要做任何事情来完成这项工作。您无需更改模板。你不需要编写任何额外的 JS。

项目源有一个使用动态表格内联的工作示例:https://bitbucket.org/mlavin/django-selectable/src/33e4e93b3fb3/example/core/admin.py#cl-39

【讨论】:

  • 好的,谢谢。如果有帮助,可以通过将 bindSelectables('row') 添加到 tabular.html 中的 onAfterAdded 函数来解决问题。
  • 是的,这会起作用,但这正是我在编写此修复程序时试图避免做的事情。再次请注意 admin/edit_inline/tabular.html 在示例项目中未修改,但动态内联正在工作(至少对我而言)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 1970-01-01
  • 2011-07-30
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-28
相关资源
最近更新 更多