2010-01-28 31 views
47

Tôi có giao diện quản trị django và trong danh sách mô hình, tôi muốn cột tùy chỉnh sẽ là siêu liên kết sử dụng một trong các giá trị trường. Về cơ bản, một trong các trường của mô hình là url và tôi muốn cột có URL đó trong siêu liên kết có thể nhấp. Liên kết này sẽ cần có URL bổ sung được thêm vào nó làm đường dẫn tương đối của nó trong trường mô hình.Làm cách nào để thêm cột tùy chỉnh có siêu kết nối trong giao diện quản trị django?

+1

Bản sao có thể có của [Cách thêm liên kết có thể nhấp vào một trường trong quản trị Django?] (Http://stackoverflow.com/questions/1949248/how-to-add-clickable-links-to-a-field-in -django-admin) – Louis

Trả lời

60

Xác định phương thức trong lớp ModelAdmin của bạn và đặt thuộc tính allow_tags thành True. Điều này sẽ cho phép phương thức trả lại HTML không thoát để hiển thị trong cột.

Sau đó liệt kê danh sách dưới dạng mục nhập trong thuộc tính ModelAdmin.list_display.

Ví dụ:

class YourModelAdmin(admin.ModelAdmin): 
    list_display = ('my_url_field',) 

    def my_url_field(self, obj): 
     return '<a href="%s%s">%s</a>' % ('http://url-to-prepend.com/', obj.url_field, obj.url_field) 
    my_url_field.allow_tags = True 
    my_url_field.short_description = 'Column description' 

Xem tài liệu cho ModelAdmin.list_display để biết thêm chi tiết.

+0

Tôi phát hiện ra một ngày khác mà bạn thực sự không cần thẻ 'a', vì quản trị viên Django sẽ tự động biến URL thành siêu liên kết. Tôi không phải ở máy tính của tôi, vì vậy tôi có thể sai. Trong trường hợp của tôi, tôi không cần phải đặt 'allow_tags'. Tôi cũng đã tạo ra một hàm 'get_url()' trên mô hình của tôi, trái ngược với mô hình quản trị của tôi - nhưng nó khá tầm thường. Tuy nhiên, cách của bạn là tốt nhất nếu chúng ta muốn mở liên kết trong một cửa sổ mới với 'target = _blank' - Hy vọng điều này là hữu ích. –

10

Sử dụng tiện ích format_html. Điều này sẽ thoát khỏi bất kỳ html từ các tham số và đánh dấu chuỗi là an toàn để sử dụng trong các mẫu. Thuộc tính phương thức allow_tags đã không được dùng nữa trong Django 1.9.

from django.utils.html import format_html 

class MyModelAdmin(admin.ModelAdmin): 
    list_display = ['show_url', ...] 
    ... 

    def show_url(self, obj): 
     return format_html("<a href='http://pre.com{0}'>{0}</a>", obj.url) 

Bây giờ người dùng quản trị của bạn được an toàn ngay cả trong trường hợp:

url == '<script>eval(...);</script>' 

Xem the documentation để biết thêm.

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