我正在使用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后,我尝试绑定到inlines 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 但那是使用formset插件。有没有办法将bindSelectable(行)用于admin内联?
答案 0 :(得分:0)
您发布的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