Django-выбираемый с динамическими строками - PullRequest
1 голос
/ 01 сентября 2011

Я использую 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, ]

После прочтения вашегоticket http://code.djangoproject.com/ticket/15760 Я пытался связать событие inline 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, кажется, что эти триггеры не 'т в версии 1.3.1 Джанго.Нужно ли привязываться к событию, которое запускается при добавлении inline?Здесь есть похожий случай https://bitbucket.org/mlavin/django-selectable/issue/31/dynamically-added-forms, но он использует плагин formset.Есть ли способ использовать bindSelectable (row) для inline администратора?

1 Ответ

0 голосов
/ 16 ноября 2011

Код 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

...