2017-09-11 4 views
0

Un django-mptt TreeNodeChoiceField donne des options de sélection indentées, alors que je peux filtrer mes résultats en utilisant django-autocomplete-light. Toutefois, le widget ModelSelect2 remplace le fichier html rendu, ce qui supprime l'indentation.Combiner django mptt TreeNodeChoiceField avec widget django-autocomplete-light ModelSelect2

Je voudrais combiner les deux. Une idée de comment je pourrais y arriver?

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

Répondre

0

Je vais laisser ma solution ici au cas où quelqu'un essaie d'obtenir le même. Après avoir exploré le code source de django-mptt et les exemples de django-autocomplete-light, j'ai découvert que vous pouvez remplacer le texte d'affichage des options de sélection. De plus, django-mptt utilise le niveau du noeud pour insérer une indentation correcte. Mon modèle et ma forme restent les mêmes. Je devais simplement remplacer la méthode get_result_label() de ma vue de saisie semi-automatique:

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