将django mptt TreeNodeChoiceField与django-autocomplete-light ModelSelect2小部件组合在一起

时间:2017-09-11 10:32:34

标签: django django-mptt django-autocomplete-light

django-mptt TreeNodeChoiceField提供缩进的选择选项,而我可以使用django-autocomplete-light过滤我的结果。但是,ModelSelect2小部件会覆盖呈现的html,这会删除缩进。

我想把两者结合起来。知道如何实现这个目标吗?

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', )

1 个答案:

答案 0 :(得分:2)

我会留下我的解决方案,以防有人试图达到同样的目的。

在深入研究django-mptt源代码和django-autocomplete-light示例之后,我发现你可以覆盖选择选项的显示文本。另外,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