覆盖save_model并关闭窗口

时间:2012-04-12 21:25:35

标签: django

我正在编写代码以在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对象。

感谢您的帮助。

2 个答案:

答案 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,只要它存在就无关紧要。