我正在编写代码以在django admin中打开一个新窗口以添加模型实例并在保存时关闭。这与ForeignKey字段add(绿色加号)的行为非常相似,但没有选择新创建的模型实例(因为它不是外键字段)。
我添加的代码是弹出链接:
link = '<a id="add_id_event" class="add-another" onclick="return showAddAnotherPopup(this);" href="%s?date=%s">add</a>' % ( addurl,currentdate)
我的模型叫做Event。我正确添加了RelatedObjectLookups.js
当我尝试保存此模型时,django应用与ForeignKey字段相同的代码并尝试激活我没有的SelectBox。这会导致javascript在进入window.close()
之前失败我尝试用
覆盖save_model函数def save_model(self, request, obj, form, change):
if request.GET.get('_popup') == '1':
obj.save()
return HttpResponse('<script type="text/javascript">window.close()</script>')
使用此代码,但忽略HttpResponse调用,django呈现默认值。 e.g。
<script type="text/javascript">opener.dismissAddAnotherPopup(window, "14382", "TMC 2012\u002D02\u002D02 10:00:00 DDT2010B\u002D028");</script>
失败,因为没有目标SelectBox对象。
感谢您的帮助。
答案 0 :(得分:3)
您需要覆盖 ModelAdmin.response_add 。这就是重定向发生的地方。
在我的情况下,我需要覆盖dismissAddAnotherPopup方法,所以我创建了一个名为dismissAddAnotherPopupWithUpdate的新方法来处理我喜欢的M2M小部件。这是我使用的代码:
def response_add(self, request, obj, post_url_continue='../%s/'):
"""
Overriding to force the widget to update
"""
resp = super(ModelAdmin, self).response_add(request, obj, post_url_continue)
if request.POST.has_key("_popup"):
return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopupWithUpdate(window, "%s", "%s");</script>' % \
# escape() calls force_unicode.
(escape(obj._get_pk_val()), escape(obj)))
return resp
答案 1 :(得分:0)
虽然Cari的解决方案当然有效,但一个简单的解决方案是在<a>
标签中指定有效的ID。使用了id,因此dismissAddAnotherPopup()
可以在关闭窗口后选择适当的字段。无论您为window.close()
指定哪个ID,只要它存在就无关紧要。