Tag cetakan Django untuk memotong teks

91

Django memiliki truncatewordstag cetakan, yang memotong teks pada jumlah kata yang diberikan. Tapi tidak ada yang seperti truncatechars .

Apa cara terbaik untuk memotong teks dalam template pada batas panjang karakter tertentu?

grigy
sumber

Jawaban:

170

Ini baru saja ditambahkan di Django 1.4. misalnya:

{{ value|truncatechars:9 }}

Lihat dok di sini

Banjer
sumber
3
"truncatechars" juga bekerja pada Django 1.9 terbaru
Isanka Wijerathne
62
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}

Memperbarui

Sejak versi 1.4, Django mempunyai tag cetakan built-in untuk ini:

{{ value|truncatechars:9 }}
caio
sumber
Karena saya bekerja dengan pra-1.4 Django, inilah yang saya butuhkan. Terima kasih!
Trey Piepmeier
1
yang truncatecharssaringan menambahkan karakter elips secara default.
cnfw
11

Saya membuat filter template saya sendiri, yang menambahkan "..." ke akhir (kata terakhir dari) string (terpotong) juga:

from django import template
register = template.Library()

@register.filter("truncate_chars")
def truncate_chars(value, max_length):
    if len(value) > max_length:
        truncd_val = value[:max_length]
        if not len(value) == max_length+1 and value[max_length+1] != " ":
            truncd_val = truncd_val[:truncd_val.rfind(" ")]
        return  truncd_val + "..."
    return value
jki
sumber
2
Defaultnya sekarang adalah django.
Pulkit Sharma
6

Jika Anda lebih suka membuat tag cetakan kustom Anda sendiri, pertimbangkan untuk menggunakan Django util Truncator di dalamnya. Berikut ini adalah contoh penggunaan:

>>> from django.utils.text import Truncator
>>> Truncator("Django template tag to truncate text")
<Truncator: <function <lambda> at 0x10ff81b18>>
>>>Truncator("Django template tag to truncate text").words(3)
u'Django template tag...'
Truncator("Django template tag to truncate text").words(1)
u'Django...'
Truncator("Django template tag to truncate text").chars(20)
u'Django template t...'
Truncator("Django template tag to truncate text").chars(10)
u'Django ...'

Kemudian Anda dapat memasukkannya ke dalam tag template:

from django import template
from django.utils.text import Truncator

register = template.Library()

@register.filter("custom_truncator")
def custom_truncator(value, max_len, trunc_chars=True):
    truncator = Truncator(value)
    return truncator.chars(max_len) if trunc_chars else truncator.words(max_len)
Dos
sumber
2

Anda dapat mencapai tujuan Anda dengan kode serupa:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

di mana NUM_OF_CHARS_TO_TRUNCATEjumlah karakter yang tersisa.

Abuko Sidney
sumber
1

slice

Ignacio Vazquez-Abrams
sumber
Terima kasih, tapi ini bukan yang saya butuhkan.
grigy
Bagaimana? Ini dapat digunakan untuk memotong string.
Ignacio Vazquez-Abrams
Dokumentasi mengatakan itu untuk daftar. Juga tidak menambahkan "..." ke teks yang terpotong.
grigy
1
"..." perlu ditambahkan hanya jika terpotong.
grigy
2
Ini menjawab pertanyaan OP, dan ini akan bekerja dengan versi Django yang lebih lama. Padahal dengan versi yang lebih baru truncatecharsharus lebih disukai, karena lebih eksplisit.
persegi panjang
0

Menambahkan filter "truncate" adalah permintaan fitur selama 4 tahun tetapi akhirnya masuk ke trunk, sejauh yang saya mengerti https://code.djangoproject.com/ticket/5025 - jadi kami harus menunggu rilis atau penggunaan berikutnya bagasi.

Hraban
sumber