旧それなりブログの跡地、画像やスタイルやJSなどが壊れてることがあります。

[Django, Python] Change ListのURLをリンクにする

2008年11月25日

Adminサイトの変更リスト内にURLを表す文字列が合った場合に、ハイパーリンクへ変換する方法です。
本来的な対応は面倒そうに見えたので、JavaScriptで強引にやりました。
Djangoバージョンは 0.96.2 です。

改修は django/contrib/admin/templates/admin/change_list.html を修正します。
テンプレの改修手順は、Django本来のやり方に従ってください。

(変更前)

{% block result_list %}{% result_list cl %}{% endblock %}

(変更後)

{% block result_list %}
<script type="text/javascript">
(function(){
var id = '__change_urls_to_links__';
document.write('<div id="' + id + '"></div>');
var e = document.createElement('a');
e.innerHTML = '[Change urls to links]';
e.href = "javascript:void(0);";
var f = function(){var l=document.getElementById("changelist").getElementsByTagName("td");for(var i=0;i<l.length;i++){var h=l[i].innerHTML;l[i].innerHTML=h.replace(/^https?:.+$/,'<a href="'+h+'" target="_blank">'+h+'</a>',h)}}
e.onclick = f;
document.getElementById(id).appendChild(e);
})();
</script>
{% result_list cl %}{% endblock %}
  • 改修後に画面に表示される Change urls to links というリンクを押すと変換されます。
  • 処理は、tdタグのinnerHTMLが”http://”や”https://”で始まる文字列を
    URLとみなしてリンクに変換するだけです。
    なんで、中のテキスト次第では、リンクにしたくない文字列がリンクになったり、XSSを発生させるセキュリティホールになります。
  • 下記はテンプレいじりたくなーい!という人向けにブクマ化したもの
    [Change urls to links]

JSは便利だなー。