Django có truncatewords
thẻ 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:
Điều này gần đây đã được thêm vào Django 1.4. ví dụ:
{{ value|truncatechars:9 }}
{{ 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 }}
truncatechars
bộ lọc bổ sung thêm một nhân vật hình elip theo mặc định.
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
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)
Đây là trong Tài liệu Django, các thẻ và bộ lọc mẫu tích hợp sẵn: truncatechars
Bạn nên viết bộ lọc mẫu tùy chỉnh: http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#writing-custom-template-filters
Hãy xem cách truncatewords
được xây dựng trongdjango.utils.text
truncatechars
nên được ưu tiên hơn, do nó rõ ràng hơn.
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_TRUNCATE
là số ký tự để lại.
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.