Thẻ mẫu Django để cắt bớt văn bản


88

Django có truncatewordsthẻ mẫu, thẻ này cắt văn bản theo số lượng từ nhất định. Nhưng không có gì giống như truncatechars .

Cách tốt nhất để cắt văn bản trong mẫu ở giới hạn chiều dài ký tự đã cho là gì?

Câu trả lời:



61
{{ value|slice:"5" }}{% if value|length > 5 %}...{% endif %}

Cập nhật

Kể từ phiên bản 1.4, Django có một thẻ mẫu tích hợp cho việc này:

{{ value|truncatechars:9 }}

Vì tôi đang làm việc với Django trước 1.4, đây chính là thứ tôi cần. Cảm ơn!
Trey Piepmeier

1
các truncatecharsbộ lọc bổ sung thêm một nhân vật hình elip theo mặc định.
cnfw

10

Tôi đã tạo bộ lọc mẫu của riêng mình, thêm "..." vào cuối (từ cuối cùng của) chuỗi (bị cắt ngắn):

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

2
Mặc định của nó bây giờ nó django.
Pulkit Sharma

6

Nếu bạn muốn tạo riêng mẫu tùy chỉnh thẻ của bạn, hãy xem xét sử dụng Django util Truncator trong đó. Sau đây là cách sử dụng mẫu:

>>> 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 ...'

Sau đó, bạn có thể đặt nó vào thẻ mẫu:

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)



1

Cảm ơn, nhưng đây không phải là những gì tôi cần.
cáu kỉnh

Làm sao vậy? Nó có thể được sử dụng để cắt chuỗi.
Ignacio Vazquez-Abrams

Tài liệu cho biết nó dành cho danh sách. Ngoài ra, nó không nối "..." vào văn bản bị cắt ngắn.
cáu kỉnh

1
Chỉ cần thêm "..." nếu nó bị cắt bớt.
cáu kỉnh

2
Điều này trả lời câu hỏi của OP và điều này sẽ hoạt động với các phiên bản cũ hơn của Django. Mặc dù với các phiên bản mới hơn truncatecharsnên được ưu tiên hơn, do nó rõ ràng hơn.
chữ nhật,

1

Bạn có thể đạt được mục tiêu của mình với mã tương tự:

{{ value_of_text|truncatechars:NUM_OF_CHARS_TO_TRUNCATE}}

đâu NUM_OF_CHARS_TO_TRUNCATElà số ký tự để lại.


0

Thêm bộ lọc "cắt ngắn" là một yêu cầu tính năng trong 4 năm nhưng cuối cùng đã hạ cánh trong thân cây, theo như tôi hiểu https://code.djangoproject.com/ticket/5025 - vì vậy chúng tôi phải đợi bản phát hành tiếp theo hoặc sử dụng Thân cây.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.