2010-02-19 44 views
29

chức năng urlize từ django.utils.html chuyển đổi url thành liên kết có thể nhấp. Vấn đề của tôi là tôi muốn gắn một target = "_ blank" vào "< href ..>", để tôi mở liên kết này trong một tab mới. Có cách nào để tôi có thể mở rộng hàm urlize để nhận thêm một đối số không? hoặc tôi nên tạo một bộ lọc tùy chỉnh bằng cách sử dụng regexes để làm công cụ này? Điều này có hiệu quả không?mở rộng urlize trong django

Trả lời

4

Không có khả năng tích hợp sẵn trong urlize() để thực hiện việc này. Do giấy phép của Django, bạn có thể sao chép mã của django.utils.html.urlizedjango.template.defaultfilters.urlize vào dự án của bạn hoặc vào một ứng dụng riêng biệt và sử dụng các định nghĩa mới thay thế.

-3

Bạn không nên thêm target="_blank" vào các liên kết của mình, nó không còn được dùng nữa. Người dùng nên tự quyết định xem họ có muốn mở liên kết hay không.

Bạn vẫn có thể mở liên kết với không phô trương JavaScript như vậy (sử dụng jQuery):

$('.container a').click(function(e){e.preventDefault();window.open(this.href);}); 

Điều đó nói rằng, bạn có thể viết bộ lọc riêng của bạn, nhưng bạn sẽ phải sao chép rất nhiều mã từ django.utils.html.urlize , không thực sự là DRY.

+2

Không còn được dùng nữa trong HTML5. –

+0

"Không được chấp nhận nữa trong HTML5" Đó là sự thật. W3Schools cho biết [Thẻ HTML5 A] (http://www.w3schools.com/html5/tag_a.asp) và một bài viết khác cho biết [XHTML không dùng nữa Thẻ mục tiêu] (http://www.infranet.com/_blog/Complete_Website_Optimization_Blog/ post/Replacing_the_XHTML_deprecated_a_target_tag /) –

+0

W3Schools không phải là một nguồn tốt. Thay vì trực tiếp đi đến spec. – stefanw

54

Bạn có thể thêm một bộ lọc tùy chỉnh, như mô tả here:

tôi đã sử dụng cái này:

def url_target_blank(text): 
    return text.replace('<a ', '<a target="_blank" ') 
url_target_blank = register.filter(url_target_blank, is_safe = True) 

Ví dụ về sử dụng:

{{ post_body|urlize|url_target_blank }} 

trình tốt cho tôi :)

+0

câu trả lời hay, nó cũng giúp tôi, cảm ơn! – dana

+9

Tôi phải thêm: url_target_blank.is_safe = True để ngăn chặn django thoát khỏi liên kết. –

+1

Để cho phép sử dụng rộng hơn url_target_blank và để làm cho nó hơi chặt chẽ hơn: Tôi sẽ sử dụng thông số thường xuyên trong dòng trả về: def url_target_blank (giá trị): return re.sub ("] +) (? ", '< một mục tiêu = "_ trống" \\ 1> ', giá trị) – Boaz

13

Phiên bản ngắn nhất, mà tôi sử dụng trong các dự án của mình. Tạo bộ lọc mới, mở rộng bộ lọc mặc định của Django:

from django import template 
from django.template.defaultfilters import stringfilter 
from django.utils.safestring import mark_safe 
from django.utils.html import urlize as urlize_impl 

register = template.Library() 

@register.filter(is_safe=True, needs_autoescape=True) 
@stringfilter 
def urlize_target_blank(value, limit, autoescape=None): 
    return mark_safe(urlize_impl(value, trim_url_limit=int(limit), nofollow=True, autoescape=autoescape).replace('<a', '<a target="_blank"')) 
+0

Bạn cũng cần 'từ django.utils.safestring mark_safe' – Nick

+0

Bạn nói đúng - cảm ơn. Đã sửa câu trả lời. –