2009-11-26 4 views
7

Ich versuche, eine Blog-App zu erstellen, und das Problem ist, wenn ich Tag 'trunkatewords_html' in meiner Vorlage verwenden, um Beiträge länger als die angegebene Anzahl von Wörtern abzuschneiden, muss ich den vollständigen Beitrag durch einen Titel wie 'Lesen Sie mehr. .. nach dem Abschneiden. Also sollte ich wissen, dass der Beitrag abgeschnitten wurde oder nicht.Wie finden Sie, dass der Inhalt abgeschnitten ist?

S.S .: Ist das ein pythischer Weg, um das Problem zu lösen?

{% ifequal post.body|length post.body|truncatewords_html:max_words|length %} 
    {{ post.body|safe }} 
{% else %} 
    {{ post.body|truncatewords_html:max_words|safe }}<a href="{{ post.url}}">read more</a> 
{% endifequal %} 

Antwort

4

Dies ist ziemlich kompliziert, aber Django hat einige seltsame Ecken. Grundsätzlich Figur, die ich, wenn die String-Länge das gleiche ist, wenn man sich x gestutzt und x + 1 Worte dann wird die Zeichenfolge nicht abgeschnitten worden ...

{% ifnotequal post.body|truncatewords_html:30|length post.body|truncatewords_html:31|length %} 
    <a href="#">read more...</a> 
{% endifnotequal %} 
2

Sie ein eigenes Template-Tag schreiben konnte (django docs sehen) oder manuell in der Vorlage überprüfen, ob der Inhalt der vorgegebene Länge über length builtin Filter überschreitet angezeigt werden soll.

+1

+1 für die einfache Methode zur Überprüfung, ob die Anzeige der Länge überschreitet. Einfach und funktioniert gut. –

1

Es kommt auf persönliche Vorliebe, aber für meinen Geschmack machst du viel zu viel Arbeit in der Vorlage. Ich würde vielleicht eine Methode auf dem Post-Modell, read_more_needed(), erstellen, die abhängig von der Länge des Textes True oder False zurückgibt. zB:

def read_more_needed(self): 
    from django.utils.text import truncate_html_words 
    return not truncate_html_words(self.body,30)==truncate_html_words(self.body,31) 

Dann Vorlage würde lauten:

{% if post.read_more_needed %} 
    {{ post.body|truncatewords_html:30|safe }}<a href="{{ post.url}}">read more</a> 
{% else %} 
    {{ post.body|safe }} 
{% endif %} 
+0

Wenn Sie "read_more_need()" zum Modell hinzufügen, sollten Sie auch die Abschneidung im Modell vornehmen. Derselbe Code, der die Kürzung durchführt, sollte bestimmen, ob der Inhalt abgeschnitten wurde. – Bryce

Verwandte Themen