ManyToManyField
을 filter_horizontal
처럼 admin으로 표시하고 사용자가 필터 필드에 입력 할 때 옵션을 채 웁니다. 많은 옵션이 있으며 한꺼번에로드하는 데 많은 시간이 걸립니다.Django : AJAX ManyToManyField in admin
나는 django-ajax-filtered-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
아약스 부분. 나 자신의 jQuery 스 니펫을 작성하거나 admin/media/js
과 함께 제공되는 SelectFilter2
을 수정해야합니까? 누구도 전에 거기에 있었 니?
편집 : , 문제의 핵심에 관련된 난 단지 필드의 위젯을 대체하려면로, 짧은 방법은 formfield_overrides
을 사용하는 것은 아니지만 :
class MultiSelectWidget(FilteredSelectMultiple):
# as above
class MyAdmin(admin.ModelAdmin):
formfield_overrides = {
models.ManyToManyField: {'widget': MultiSelectWidget},
}
당신은 더 구체적 일 수 있습니까? – omat