ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javascript – Django Admin – RelatedObjectLookups – 如何刷新并设置父窗口上的选择?

2019-07-30 04:37:29  阅读:173  来源: 互联网

标签:javascript django django-forms django-admin


我希望我的一个表单像管理页面一样工作,所以我想我会查看代码,看看它是如何工作的.

具体来说,我希望用户能够单击选择列表旁边的“”图标,然后转到管理页面的弹出窗体以添加新项目.

当他们在那里输入新项目时,我希望新项目出现在选择框中,然后被选中(就像此功能在管理页面上的工作方式一样).

我将管理js库复制到我自己的模板中,我使链接调用相同的JS函数,并且弹出窗口确实正确打开,但是在我保存一个新对象后,弹出窗口变为空白而不是关闭,并且没有任何反应父页面.

这是我放在页面中的内容:

...
<td>
    <div class="fieldWrapper">
        <select name="form-0-plasmid" id="id_form-0-plasmid">
        ...
        </select>
        <a href="/admin/VirusTracker/plasmid/add/" class="add-another" id="add_id_plasmid" onclick="return showAddAnotherPopup(this);"> <img src="/media/admin/img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>
    </div>
</td>
...

我尝试单步执行管理表单上的javascript以查看它是如何工作的,但我没有看到任何会关闭窗口或填充父窗口选择的内容.

在此先感谢您的帮助.

更新3

运行dismissAddAnotherPopup时,我收到此javascript错误

"SelectBox is not defined"

这是指向dismissAddAnotherPopup中的这一行

SelectBox.add_to_cache(toId, o);

我以为我知道Javascript,但我没有看到该变量应该来自哪里:-(

更新2

一切似乎都正常射击.在弹出窗口中单击“保存”后,我得到一个空白页面.这是该页面的来源:

<script type="text/javascript">opener.dismissAddAnotherPopup(window, "9", "CMV_flex_myr_GENE1_._._WPRE_BGH");</script>

所以看起来这个javascript没有被执行或者失败了.

更新

这是Daniel提到的相关代码.所以唯一的问题是这个代码要么没有触发,要么触发不正确.

Django的/的contrib /管理/ options.py:

...
        if request.POST.has_key("_popup"):
            return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, "%s", "%s");</script>' % \
                # escape() calls force_unicode.
                (escape(pk_value), escapejs(obj)))
...

/media/admin/js/admin/RelatedObjectLookups.js:

function dismissAddAnotherPopup(win, newId, newRepr) {
    // newId and newRepr are expected to have previously been escaped by
    // django.utils.html.escape.
    newId = html_unescape(newId);
    newRepr = html_unescape(newRepr);
    var name = windowname_to_id(win.name);
    var elem = document.getElementById(name);
    if (elem) {
        if (elem.nodeName == 'SELECT') {
            var o = new Option(newRepr, newId);
            elem.options[elem.options.length] = o;
            o.selected = true;
        } else if (elem.nodeName == 'INPUT') {
            if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) {
                elem.value += ',' + newId;
            } else {
                elem.value = newId;
            }
        }
    } else {
        var toId = name + "_to";
        elem = document.getElementById(toId);
        var o = new Option(newRepr, newId);
        SelectBox.add_to_cache(toId, o);
        SelectBox.redisplay(toId);
    }
    win.close();
}

解决方法:

好吧,javascript只是使用启动元素的id属性来标识要更新的选择字段. (从beginig中删除’add_’后).

所以我只是更改了链接的id属性以匹配模板中select元素的id:

<a href="/admin/VirusTracker/plasmid/add/" class="add-another" id="add_id_{{field.html_name}}" onclick="return showAddAnotherPopup(this);"> <img src="/media/admin/img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>

哇,我希望这已被记录在某个地方!我失去了几个小时.

(有关如何工作的更多技术细节,请参阅我对问题的更新.)

标签:javascript,django,django-forms,django-admin
来源: https://codeday.me/bug/20190730/1578793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有