Я очистил ваш код, но, как упомянул @ fish2000, это все еще грязный способ сделать это. Я придумал следующее:
<html>
<head>
<script>
var thumbs = [];
var hovers = [];
{% for p in p %}
thumbs.push(new Image());
thumbs[thumbs.length - 1].src = p.thumbnail_image.url;
hovers.push(new Image());
hovers[hovers.length - 1].src = p.display.url;
{% endfor %}
</script>
</head>
<body>
{% for idx, p in enumerate(p) %}
<a href="">
<img src="{{ p.thumbnail_image.url }}" border=0 name="rollover" onmouseover="this.src = window.hovers[{{ idx }}].src" onmouseout="this.src = window.thumbs[{{ idx }}].src">
</a>
{% endfor %}
</body>
</html>
Я написал базовый пример в JSFiddle, чтобы попытаться смоделировать то, что будет генерировать ваш код Python: http://jsfiddle.net/TeEHU/
Чтобы немного объяснить, что я сделал, вначале я настроил пару массивов JavaScript, чтобы они содержали как миниатюры, так и указатели. Изначально я просто собирал их в виде массивов строк, ссылающихся на URL-адреса, но следовал тому же принципу, который вы использовали, используя объект Image для предварительной загрузки изображений.
Отсюда я избавился от атрибутов обработчика событий, которые вы определили в теге привязки, и переместил его в тег изображения, чтобы мы могли иметь прямой доступ к атрибутам изображения, когда пользователь на него наложил.
Обычно я не оправдываю использование динамического JavaScript на стороне сервера, но я просто пытался соответствовать вашему коду.