2010-11-02 34 views
5

Le filtre truncatewords insère un espace avant les elipsis. Comme dans « Un beau livre de recettes de vacances de ... »
par rapport au
désiré « Un livre de recettes de vacances bien de ... »Comment ajouter une ellipse dans un template Django en utilisant truncatewords sans l'espace final?

est-il un moyen facile d'obtenir ce filtre pour ne pas mettre un espace là? Je pourrais prendre soin de ceci dans la vue assez facilement, mais préférerais le faire dans le modèle - idéalement sans créer un filtre personnalisé. Toutes les suggestions sont les bienvenues.

Répondre

5

Il y a un tas de filtres de modèle à Djangosnippets et this one looks pretty neat:

# From http://djangosnippets.org/snippets/1259/ 

from django import template 

register = template.Library() 

@register.filter 
def truncatesmart(value, limit=80): 
    """ 
    Truncates a string after a given number of chars keeping whole words. 

    Usage: 
     {{ string|truncatesmart }} 
     {{ string|truncatesmart:50 }} 
    """ 

    try: 
     limit = int(limit) 
    # invalid literal for int() 
    except ValueError: 
     # Fail silently. 
     return value 

    # Make sure it's unicode 
    value = unicode(value) 

    # Return the string itself if length is smaller or equal to the limit 
    if len(value) <= limit: 
     return value 

    # Cut the string 
    value = value[:limit] 

    # Break into words and remove the last 
    words = value.split(' ')[:-1] 

    # Join the words and return 
    return ' '.join(words) + '...' 
+0

Oui, j'ai quelque chose de similaire en tant que fonction pour les vues. Je pense que ça pourrait aussi bien en faire une balise de modèle, hmm? Merci pour le lien. – JAL

+1

Hmm, la question demeure pourquoi le comportement par défaut de Django est d'insérer un espace quand c'est incorrect. – thepeer

2

Cela fonctionne également:

{{ value|truncatewords:3|slice:"-4" }}... 

Fondamentalement, tranche juste à côté des 4 derniers caractères (ellipse espace plus) , puis ajoutez-le sans l'espace! La bonne chose est, avec cette méthode, vous pouvez également terminer votre troncature avec tout ce que vous voulez.

+4

Le problème évident avec cette méthode est que si votre 'valeur' est plus courte que le nombre passé à' truncatewords', alors vous coupez juste les 4 derniers caractères et ajoutez une ellipse. Bien sûr, vous pouvez toujours contourner cela en mesurant la longueur de 'value' et en utilisant une boucle' if'. – tankadillo

+0

En plus de la troncature excessive mentionnée ci-dessus, cela ajoutera toujours le '...', même si la chaîne est suffisamment courte (par exemple '' bla '' | truncatewords: 3' montrerait 'blah', pas' bla ... ') – dbr

+2

Pour mettre les commentaires de jbpjackson et dbr en d'autres termes, ne faites pas ceci. – slypete