Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/429.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Django-反向工程管理站点的“添加外键”按钮_Javascript_Django_Django Models - Fatal编程技术网

Javascript Django-反向工程管理站点的“添加外键”按钮

Javascript Django-反向工程管理站点的“添加外键”按钮,javascript,django,django-models,Javascript,Django,Django Models,TL;DR Short简介: 我已经在自己的项目中重新创建了管理员添加按钮。但是,当我在父窗体上单击save时,它无法识别新的select元素 整个故事: 我在自己的项目中使用了该功能。。。几乎我需要你帮我找出最后一步。现在,我有一个+按钮,我点击它,弹出窗口显示,我添加一个新对象,点击保存,弹出窗口关闭,新项目现在在我的选择框中并被选中-就像管理页面一样。但是,当我在这个父窗体上点击save时,我得到一个错误,我选择了一个不在列表中的项目。当然,由于页面已经重新加载,我的新项目是列表的一部分,

TL;DR Short简介:

我已经在自己的项目中重新创建了管理员添加按钮。但是,当我在父窗体上单击save时,它无法识别新的select元素

整个故事:

我在自己的项目中使用了该功能。。。几乎我需要你帮我找出最后一步。现在,我有一个+按钮,我点击它,弹出窗口显示,我添加一个新对象,点击保存,弹出窗口关闭,新项目现在在我的选择框中并被选中-就像管理页面一样。但是,当我在这个父窗体上点击save时,我得到一个错误,我选择了一个不在列表中的项目。当然,由于页面已经重新加载,我的新项目是列表的一部分,我只需再次点击save,它就可以工作了。当然,我需要它来节省第一次

基本设置是我的父模型称为System,外键模型称为Zone。分区模型列出了一个系统有多少个分区:1个分区、2个分区、10个分区等等

好的,一些代码:

父窗体模板中的添加链接:

在我的New_Zone视图中,保存新区域后,我检查popup GET变量是否为1,如果是,则返回一个javascript函数。以下是观点:

        ...
        if form.is_valid():
            f = form.save(commit=False)
            pk_value = f.numOfZones
            form.save()
            obj = Zone_Info.objects.get(numOfZones=pk_value)
            if isPopup == "1":
                return HttpResponse('<script>opener.closeAddPopup(window, "%s", "%s");</script>' % (escape(pk_value), escape(obj)))
        ...
下面是我的Javascript,主要是从管理员Javascript复制而来的:

function html_unescape(text) {
// Unescape a string that was escaped using django.utils.html.escape.
    text = text.replace(/&lt;/g, '<');
    text = text.replace(/&gt;/g, '>');
    text = text.replace(/&quot;/g, '"');
    text = text.replace(/&#39;/g, "'");
    text = text.replace(/&amp;/g, '&');
    return text;
}

function windowname_to_id(text) {
    text = text.replace(/__dot__/g, '.');
    text = text.replace(/__dash__/g, '-');
    return text;
}


function showAddPopup(triggeringLink, pWin) {
    var name = triggeringLink.id.replace(/^add_/, '');
    href = triggeringLink.href;
    var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
    win.focus();
    return false;
}

function closeAddPopup(win, newID, newRepr) {
    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();
}
我看了一下这个问题,似乎我也在做同样的事情

关于如何让表单识别新的select元素的最后一步,有什么想法吗

谢谢

我明白了

问题是我传递给closeAddPopup javascript函数的内容。本质上,我是在传递垃圾值

以下是我最初在新的分区视图中使用的但不起作用的内容:

    ...
    if form.is_valid():
        f = form.save(commit=False)
        pk_value = f.numOfZones
        form.save()
        obj = Zone_Info.objects.get(numOfZones=pk_value)
        if isPopup == "1":
            return HttpResponse('<script>opener.closeAddPopup(window, "%s", "%s");</script>' % (escape(pk_value), escape(obj)))
    ...
无论如何。。。幸亏嗯,是的。如果不在stackoverflow上发布问题并重新阅读我的代码,我想我不会解决这个问题

       if form.is_valid():
           obj = form.save()
           pk_value = obj.pk
           if "_popup" in request.REQUEST:
               return HttpResponse('<script>opener.closeAddPopup(window, "%s", "%s");</script>' % (escape(pk_value), escape(obj)))