Django: AJAX ManyToManyField в админке

Я хочу отображать ManyToManyField в админке, как и filter_horizontal , но заполнять параметры по мере ввода пользователем в поле фильтра. Вариантов много, и загрузка всех сразу занимает много времени.

Я нашел django-ajax-filter-fields , но это кажется мне излишним, поскольку требует изменений в классах модели, когда все, что я хочу сделать, это заменить все поля множественного выбора в форме.

Написание настраиваемого поля виджета, наследуемого от admin.widgets.FilteredSelectMultiple , кажется правильным. Итак, я пытаюсь использовать свой собственный виджет:

class MultiSelectWidget(FilteredSelectMultiple):
    class Media:
        # here should be some js to load options dynamically
        js = (
            "some_js_to_load_ajax_options.js",
        )

    def render_options(self, choices, selected_choices):
        # this initializes the multiple select without any options
        choices = [c for c in self.choices if str(c[0]) in selected_choices]
        self.choices = choices
        return super(MultiSelectWidget, 
                     self).render_options([], selected_choices)

class MyAdminForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyAdminForm, self).__init__(*args, **kwargs)
        self.fields['m2m_field'].widget = MultiSelectWidget('m2m_field', is_stacked=False)
    class Meta:
        model = MyModel

class MyAdmin(admin.ModelAdmin):
    form = MyAdminForm

, который отображается правильно.

Но я не уверен, как реализовать эту some_js_to_load_ajax_options.js часть ajax. Должен ли я написать собственный фрагмент jQuery или изменить SelectFilter2 , который поставляется с admin / media / js ? Кто-нибудь был там раньше?

редактировать: Хотя это не связано с сутью вопроса, поскольку я хочу только переопределить виджет поля, более короткий способ - использовать formfield_overrides :

class MultiSelectWidget(FilteredSelectMultiple):
    # as above

class MyAdmin(admin.ModelAdmin):
    formfield_overrides = {
        models.ManyToManyField: {'widget': MultiSelectWidget},
    }

5
задан omat 14 February 2011 в 15:49
поделиться