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