【发布时间】:2009-10-09 22:35:31
【问题描述】:
在 django 管理员中,当用户成功保存(在我的 clean 方法之后)在弹出窗口中编辑的新的或更改的相关对象时,我希望关闭弹出窗口而不是转到不同的视图。
我相信我可以使用 response_change 或 response_add 让它转到不同的视图,但有没有办法让我关闭窗口?
【问题讨论】:
标签: django django-admin
在 django 管理员中,当用户成功保存(在我的 clean 方法之后)在弹出窗口中编辑的新的或更改的相关对象时,我希望关闭弹出窗口而不是转到不同的视图。
我相信我可以使用 response_change 或 response_add 让它转到不同的视图,但有没有办法让我关闭窗口?
【问题讨论】:
标签: django django-admin
看看原来的response_change或response_add方法做了什么:它们返回一段javascript,在父窗口中调用一个JS方法,关闭弹出窗口。
return HttpResponse('''
<script type="text/javascript">
opener.dismissAddAnotherPopup(window);
</script>'''
在父窗口中,有一个具有相关方法的脚本:
function dismissAddAnotherPopup(win) {
win.close();
}
(原来的版本传递了更多的参数,所以它用新对象更新父窗口,但如果你只是想关闭窗口,则不需要。)
【讨论】:
Daniel 提供的解决方案存在潜在错误,请参阅此 Django ticket。也就是说,如果您使用的是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)))
【讨论】: