TL; DR(简短简介):
我在自己的项目中重新创建了管理员“添加”按钮。但是,当我在父窗体上点击“保存”时,它无法识别新的选择元素。
整个故事:
我的功能在我自己的项目中工作......差不多。我需要帮助搞清楚最后一步。就像现在一样,我有一个“+”按钮,我点击它,弹出窗口显示,我添加一个新对象,点击保存,弹出窗口关闭,新项目现在在我的选择框中并被选中 - 就像管理员一样页。但是,当我点击这个父窗体上的保存时,我得到的错误是我选择了一个不在列表中的项目。当然,由于页面已经重新加载,我的新项是列表的一部分,我只是再次点击保存并且它可以正常工作。当然,我需要它第一次保存!
基本设置是我的父模型称为System
,外键模型称为Zone
。 Zone
模型列出了系统有多少个区域(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函数。以下是观点:
...
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(/</g, '<');
text = text.replace(/>/g, '>');
text = text.replace(/"/g, '"');
text = text.replace(/'/g, "'");
text = text.replace(/&/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元素的最后一步的任何想法?
谢谢!
答案 0 :(得分:4)
我想出来了
问题是我传递给我的closeAddPopup
javascript函数。基本上,我传递的是垃圾值。
以下是我最初在New_Zone
视图中显示的内容(不起作用):
...
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
并将其发送到脚本。
现在,工作视图如下所示:
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)))
无论如何......感谢......好吧,Stackoverflow。如果不发布问题并在stackoverflow上重新阅读我的代码,我认为我不会解决问题。