2017-03-16 2 views
0

Suite à cela (Customising the output of items using django-autocomplete-light v3), je personnalise la liste de choix.django-autocomplete-light v3 Personnaliser la sortie des éléments et les conserver sous la forme

Mon code:

class WordAutocomplete(autocomplete.Select2QuerySetView): 
... 
def get_result_label(self, obj): 
    template = get_template("autocomplete_light/item.html") 
    context = Context({"item": obj}) 
    return mark_safe(template.render(context)) 

Le formulaire:

class SentenceAdminForm(forms.ModelForm): 
class Meta : 
    widgets = { 
       'word':autocomplete.ModelSelect2Multiple('WordAutocomplete', 
                 attrs={'data-html': 'true'}), 
       } 

Le modèle autocomplete/item.html:

<a href="url">{{ item }}</a> 

Comme vous pouvez le voir, il y a des liens, un pour chaque objet.

Et les liens sont actifs jusqu'à ce que je sauve:

links are active in the list and in the select box

After saving, the links are no longer there

Que puis-je faire pour maintenir les liens dans la boîte de sélection?

Répondre

0

La réponse est simple.

Tout d'abord, jetez un coup d'oeil dans cet article sur select2 lui-même: Can I change how the placeholder looks?

D'accord, nous devons redéfinir templateResult fonction ou savoir comment cela fonctionne au moins.

Allez maintenant à dal docs: Overriding javascript code

On dirait templateResult défini quelque part dans autocomplete.init.js. Et oui, il est là-bas: django-autocomplete-light/src/dal_select2/static/autocomplete_light/select2.js:47

et la fonction elle-même: django-autocomplete-light/src/dal_select2/static/autocomplete_light/select2.js:7

Par ailleurs il y a des choses data-html que vous avez mentionné dans votre code.

Vous pouvez déboguer le code js, console.log() et constater que cette fonction s'applique à tous les résultats. Récupérée dynamiquement pendant que la saisie semi-automatique fonctionne et également reçue statiquement avec la page html. Ce qui est bien, tout ce que vous devez faire est de rendre les options de sélection de la même manière que les éléments de saisie semi-automatique. Plus que cela, selon votre code, vous n'avez même pas besoin de redéfinir la fonction get_result_label().

class Obj(models.Model): 
    ... 
    def __str__(self):    # __unicode__ on Python 2 
     template = get_template("autocomplete_light/item.html") 
     context = Context({"item": self.name}) # self.name or whatever 
     return template.render(context) 
     # or just: 
     # return '<a href="url">%s</a>' % self.name 

class WordAutocomplete(autocomplete.Select2QuerySetView): 
    ... 
    # Do not redefine get_result_label() 
    # def get_result_label(self, obj): 
    #  template = get_template("autocomplete_light/item.html") 
    #  context = Context({"item": obj}) 
    #  return mark_safe(template.render(context)) 

class SentenceAdminForm(forms.ModelForm): 
    class Meta : 
     widgets = { 
      'word': autocomplete.ModelSelect2Multiple(
       'WordAutocomplete', 
       attrs={'data-html': 'true'}), 
     } 
+0

Avec ce code, cela fonctionne: classe Obj (models.Model): ... def __str __ (self): retour '%s' % self.name Mais il ne fonctionne pas avec: classe Obj (models.Model): ... def __unicode __ (self): retour '%s' % self.name Quoi qu'il en soit, vous m'a aidé à le faire! –