2010-11-02 18 views
5

Bộ lọc truncatewords chèn một khoảng trống trước khi elipsis. Như trong, 'Một cuốn sách kỳ nghỉ recipe Phạt tiền ...'
vs mong muốn
'Một cuốn sách kỳ nghỉ recipe Phạt tiền ...'Làm thế nào để thêm một dấu chấm lửng trong một mẫu Django sử dụng truncatewords mà không có không gian cuối cùng?

Có một cách dễ dàng để có được bộ lọc này để không đặt một không gian ở đó? Tôi có thể quan tâm đến điều này trong giao diện khá dễ dàng, nhưng muốn làm điều đó trong mẫu - lý tưởng nhất là không tạo bộ lọc tùy chỉnh. Mọi đề xuất đều được chào đón.

Trả lời

5

Có một loạt các mẫu bộ lọc ở Djangosnippets, và this one looks pretty neat:

# From http://djangosnippets.org/snippets/1259/ 

from django import template 

register = template.Library() 

@register.filter 
def truncatesmart(value, limit=80): 
    """ 
    Truncates a string after a given number of chars keeping whole words. 

    Usage: 
     {{ string|truncatesmart }} 
     {{ string|truncatesmart:50 }} 
    """ 

    try: 
     limit = int(limit) 
    # invalid literal for int() 
    except ValueError: 
     # Fail silently. 
     return value 

    # Make sure it's unicode 
    value = unicode(value) 

    # Return the string itself if length is smaller or equal to the limit 
    if len(value) <= limit: 
     return value 

    # Cut the string 
    value = value[:limit] 

    # Break into words and remove the last 
    words = value.split(' ')[:-1] 

    # Join the words and return 
    return ' '.join(words) + '...' 
+0

Vâng, tôi có một cái gì đó tương tự như một chức năng cho chế độ xem. Tôi nghĩ có thể cũng chỉ cần làm một thẻ mẫu ra khỏi nó, hmm? Cảm ơn các liên kết. – JAL

+1

Hmm, câu hỏi vẫn là lý do tại sao hành vi Django mặc định là chèn một không gian khi điều này là không chính xác. – thepeer

2

này cũng sẽ làm việc:

{{ value|truncatewords:3|slice:"-4" }}... 

Về cơ bản, chỉ cần cắt ra khỏi 4 ký tự cuối cùng (elip không gian cộng) , và sau đó thêm nó trở lại mà không có không gian!

Điều gọn gàng là, với phương pháp này bạn cũng có thể kết thúc, uh, cắt ngắn với bất kỳ thứ gì bạn muốn.

+4

Vấn đề rõ ràng với phương pháp này là nếu 'giá trị' của bạn ngắn hơn số được chuyển đến' truncatewords', thì bạn chỉ cắt 4 ký tự cuối cùng và thêm một hình elip. Tất nhiên, bạn luôn có thể làm việc xung quanh bằng cách đo chiều dài của 'value' và sử dụng một vòng lặp' if'. – tankadillo

+0

Ngoài việc cắt ngắn quá mức nói trên, điều này cũng sẽ luôn luôn thêm '...', ngay cả khi chuỗi là đủ ngắn (ví dụ: "" blah "| truncatewords: 3' sẽ hiển thị' blah', không phải 'blah ... '). – dbr

+2

Để đặt nhận xét của jbpjackson và dbr nói cách khác, xin đừng làm điều này. – slypete

Các vấn đề liên quan