2017-09-11 17 views
0

django-mptt TreeNodeChoiceFieldはインデントされた選択肢を与えますが、django-autocomplete-lightを使用して結果をフィルタリングできます。しかし、ModelSelect2ウィジェットはレンダリングされたhtmlを上書きし、インデントを削除します。django mptt TreeNodeChoiceFieldとdjango-autocomplete-light ModelSelect2ウィジェットを組み合わせる

私は2つを組み合わせたいと思います。どのように私はこれを達成することができましたか?

models.py:

class Foo(MPTTModel): 
    name = models.CharField(max_length=50) 
    parent = TreeForeignKey('self', null=True, blank=True, related_name='children', db_index=True) 

    class MPTTMeta: 
     order_insertion_by = ['name'] 

forms.py:

class FooForm(forms.ModelForm): 
    parent = TreeNodeChoiceField(queryset=Foo.objects.all(), widget=autocomplete.ModelSelect2(url='foo-autocomplete')) 

    class Meta: 
     model = Foo 
     fields = ('name', 'parent',) 

答えて

0

私はここで誰かが同じことを達成しようとした場合の私の解決策を残しておきます。

django-mpttソースコードとdjango-autocomplete-lightの例を掘り下げた後、selectオプションの表示テキストを上書きできることがわかりました。さらに、django-mpttは正しいインデントを挿入するためにノードのレベルを使用します。私のモデルとフォームは変わりません。私はオートコンプリートビューのget_result_label()メソッドをオーバーライドしなければなりませんでした。

from mptt.settings import DEFAULT_LEVEL_INDICATOR 

class FooAutocomplete(autocomplete.Select2QuerySetView): 
    def get_result_label(self, item): 
     level_indicator = DEFAULT_LEVEL_INDICATOR * item.level 
     return level_indicator + ' ' + str(item) 

    def get_queryset(self): 
     qs = Foo.objects.all() 
     if self.q: 
      qs = qs.filter(name__istartswith=self.q) 
     return qs 
関連する問題