2017-10-19 5 views
-1

Je souhaite tronquer le contenu de mon article à l'aide d'un filtre de balise de modèle Django, tel que (| truncatewords_html: my_number). Mais avec un lien href pour les points de suspension qui redirigent l'utilisateur vers le contenu détaillé de l'article. Outre la définition d'un filtre de balise de gabarit personnalisé (tel que cité dans des threads similaires mais plus anciens), je souhaite savoir s'il existe une méthode intégrée pour atteindre le résultat souhaité.Balise de filtre truncatewords Django avec un lien href pour l'ellipse

Répondre

0

J'ai résolu ce problème. Au lieu de construire la logique dans le filtre de balise de gabarit de Django, j'envoie mes données d'API JSON (construites avec Django Rest Framework) pour être consommées par mon frontal (où j'utilise la bibliothèque JQuery). Le code est comme suit:

Serializers.py:

class PostListSerializer(ModelSerializer): 
    url = post_detail_url 
    username = serializers.SerializerMethodField() 
    date_created = serializers.SerializerMethodField() 

    def get_username(self, obj): 
     return obj.user.username 

    def get_date_created(self, obj): 
     return obj.created.strftime('%b %d %Y | at %I:%M %p') 

    class Meta: 
     model = Post 
     fields = [ 
      'id', 
      'username', 
      'title', 
      'slug', 
      'content', 
      'url', 
      'date_created', 
      ] 

views.py:

class PostListAPIView(generics.ListAPIView): 
    queryset = Post.objects.all() 
    serializer_class = serializers.PostListSerializer 

et enfin mon post_list.html:

<script type="text/javascript"> 
    $(document).ready(function(){ 
    $.ajax({ 
     url: '/api/posts/', 
     method: 'GET', 
     success: function(data){ 
     // iterate through the array of objects 
     $.each(data, function(key, value){ 
      var postUser= value.username; 
      var postTitle = value.title; 
      var postSlug = value.slug; 
      var postCreated = value.date_created; 
      var postContent = value.content; 
      var postShort; 

      if (postContent.length >= 50){ 
      // truncate long posts 
      postShort = jQuery.trim(postContent).substring(0, 50).split(" ").slice(0, -1).join(" ") 
     + "<a href='/posts/" + postSlug + "'>" + "..." + "</a>"; 
      } else { 
      postShort = postContent; 
      } 

      $('#posts-container').append(
      "<div>" + "<h4>" + postUser + ": " + "<a href='/posts/" 
     + postSlug + "'>" + postTitle + "</a>" + "<h5>" 
     + postCreated + "</h5>" + postShort + "</div>" + "<hr>" 
     ); 
     }); 
     }, 
     error: function(data){ 
     console.log('error'); 
     console.log(data); 
     } 
    }); 
    }); 
</script>