首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django -反向工程管理站点的“添加外键”按钮

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

Stack Overflow用户
提问于 2011-10-16 05:06:35
回答 1查看 2.1K关注 0票数 5

TL;DR (简略):

我在自己的项目中重新创建了admin "Add“按钮。但是,当我在父窗体上单击"save“时,它不会识别新的select元素。

全文:

我在我自己的项目中有这个功能..。差不多了。我需要帮助找出最后一步。现在,我有一个"+“按钮,我点击它,弹出弹出,我添加一个新的对象,点击保存,弹出关闭,这个新项目现在在我的选择框和选择-就像管理页。但是,当我在这个父窗体上单击save时,会得到一个错误,即我选择了列表中没有的项。当然,由于页面已经重新加载,我的新项目是列表的一部分,我只需再次点击保存,它就能工作了。当然,我需要它来保存第一次!

基本设置是我的父模型称为System,外键模型称为ZoneZone模型列出了一个系统有多少个区域(1个区域,2个区域,10个区域,等等)

好吧,一些代码:

父表单模板中的“添加”链接:

<a href="/systems/zones/new/?popup=1" id="add_id_numZones" onclick="return showAddPopup(this);">Add</a>

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

代码语言: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 (主要是从admin 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();
}

我看了一下this的问题,似乎我也在做同样的事情。

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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-16 14:52:52

,我想出来了,

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

下面是我最初在New_Zone视图中拥有的内容(它没有工作):

代码语言: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)))
    ...

对我来说,这是一个相当愚蠢的错误(显然已经很晚了)。我将f分配给字段numOfZones,我认为这是pk,并将其发送给脚本。

现在,工作视图如下所示:

代码语言:javascript
复制
       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)))

不管怎样..。感谢..。斯塔克溢流。我认为,如果不发布问题并在堆栈溢出上重新阅读代码,我就不会解决这个问题。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7782479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档