web-dev-qa-db-ja.com

Django adminインターフェイスでハイパーリンクを持つカスタム列を追加するにはどうすればよいですか?

Django adminインターフェイスがあり、モデルのリストには、フィールド値の1つを使用するハイパーリンクになるカスタム列が必要です。基本的に、モデルのフィールドの1つはurlとi 'です。 dクリック可能なハイパーリンクにそのURLを含める列のように、このリンクにはモデルフィールドの相対パスとして追加のURLを追加する必要があります。

58
mikec

ModelAdminクラスでメソッドを定義し、allow_tags属性をTrueに設定します。これにより、メソッドは列に表示するためにエスケープされていないHTMLを返すことができます。

次に、ModelAdmin.list_display属性のエントリとしてリストします。

例:

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'

詳細については、 ModelAdmin.list_display のドキュメントを参照してください。

74
user257858

使用 format_htmlユーティリティ。これにより、パラメータからhtmlがエスケープされ、テンプレートで使用しても安全であると文字列がマークされます。 allow_tags method属性は、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)

次の場合でも、管理ユーザーは安全です。

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

詳細については、 ドキュメント をご覧ください。

21
Seppo Erviälä