我想在管理員中顯示ManyToManyField
s,就像filter_horizontal
一樣,但在用戶鍵入過濾器字段時填充選項。有很多選項,一次加載它們需要很多時間。Django:AJAX ManyToManyField in admin
我發現django-ajax-filtered-fields但在我看來,這是一個矯枉過正的事情,因爲它需要對模型類進行更改,當我想要做的就是替換表單中的每個多個選擇字段。
編寫從admin.widgets.FilteredSelectMultiple
繼承的自定義控件字段似乎是正確的方法。所以我試圖推出我自己的widget:
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},
}
你能更具體嗎? – omat 2011-06-20 06:50:22