1

我正在编写代码以在 django 管理员中打开一个新窗口以添加模型实例并在保存时关闭。这与 ForeignKey field add(绿色加号)的行为非常相似,但没有选择新创建的模型实例(因为它不是外键字段)。

我添加的用于制作弹出链接的代码是:

link = '<a id="add_id_event" class="add-another" onclick="return showAddAnotherPopup(this);" href="%s?date=%s">add</a>' % ( addurl,currentdate)

我的模型称为事件。我正确添加了 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 呈现默认值。例如

<script type="text/javascript">opener.dismissAddAnotherPopup(window, "14382", "TMC 2012\u002D02\u002D02 10:00:00 DDT2010B\u002D028");</script>

失败是因为没有目标 SelectBox 对象。

谢谢你的帮助。

4

2 回答 2

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
于 2012-06-08T17:13:34.077 回答
0

虽然 Cari 的解决方案确实有效,但一个简单的解决方案是在您的<a>标签中指定一个有效的 id。使用 id 以便dismissAddAnotherPopup()可以在关闭窗口后选择适当的字段。window.close()只要它存在,您指定哪个 id 工作都没有关系。

于 2012-11-16T23:38:52.310 回答