Закрытие админки django добавить всплывающее окно связанного объекта при сохранении - PullRequest
3 голосов
/ 10 октября 2009

В администраторе django, когда пользователь успешно сохраняет (после моего метода очистки) новый или измененный связанный объект, который был отредактирован во всплывающем окне, я хотел бы закрыть всплывающее окно, а не переходить в другое представление.

Полагаю, я мог бы использовать response_change или response_add, чтобы заставить его перейти в другое представление, но есть ли способ заставить окно закрыться?

Ответы [ 2 ]

9 голосов
/ 10 октября 2009

Посмотрите, что делают оригинальные методы response_change или response_add: они возвращают фрагмент javascript, который вызывает метод JS в родительском окне, которое закрывает всплывающее окно.

return HttpResponse('''
   <script type="text/javascript">
      opener.dismissAddAnotherPopup(window);
   </script>'''

и в родительском окне есть скрипт, который имеет соответствующий метод:

function dismissAddAnotherPopup(win) {
    win.close();
}

(Исходная версия передает больше параметров, поэтому она обновляет родительское окно новым объектом, но вам это не нужно, если вы просто хотите закрыть окно.)

3 голосов
/ 10 мая 2012

Существует потенциальная ошибка с решением, предоставленным Дэниелом, см. Этот билет Django . То есть, если вы используете application/xhtml, окно не закроется, если вы вернете только скрипт. Эта ошибка с тех пор была исправлена ​​в Django.

Лучшим способом было бы добавить <!DOCTYPE html> теги, такие как текущий Django source :

'<!DOCTYPE html><html><head><title></title></head><body>'
'<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script></body></html>' % \
# escape() calls force_unicode.
(escape(pk_value), escapejs(obj)))
...