使用 django-ajax-select 时“+add”按钮无法正常工作
'+add' button doesn't work properly when django-ajax-select is used
简而言之:django-ajax-selects 可以很好地过滤现有项目,但添加新项目时会出现 JS 错误。
详情。使用 Django 3.1。
在管理站点,需要使用 ForeignField 创建模型 Choice 的对象来模拟问题。 Django-ajax-selects(DAS) 用于填充字段(动态过滤)。通过键入字母,DAS 处理查询集并输出相关问题的列表。可以从列表中选择一个问题并保存新的选择。这一切都很好。
如果通过键入没有找到合适的问题,则可以单击“+添加”按钮并在带有表单的弹出窗口 window 中添加新问题。
根据 DAS 文档单击 'Save' 后:
- 新问题必须保存到数据库中;
- 弹窗window必须关闭;
- 必须用新问题填充编辑的字段。
Screenshot with popup window
问题是 Django 在第 2 步停止:创建了新问题,弹出窗口 window 变得空白,并且没有在头部显示“Popup closing ...”关闭。
window:
中存在 JS 错误
Uncaught TypeError: window.windowname_to_id is not a function
at window.dismissAddRelatedObjectPopup (:8000/static/ajax_select/js/ajax_select.js:194)
at popup_response.js:13
空白页的HTML-代码为
<!DOCTYPE html>
<html>
<head><title>Popup closing…</title></head>
<body>
<script id="django-admin-popup-response-constants"
src="/static/admin/js/popup_response.js"
data-popup-response="{"value": "6", "obj": "Question object (6)"}">
</script>
</body>
</html>
这里是一段来自ajax_select.js的JS代码,可能出现错误的地方:
/* Called by the popup create object when it closes.
* For the popup this is opener.dismissAddRelatedObjectPopup
* Django implements this in RelatedObjectLookups.js
* In django >= 1.10 we can rely on input.trigger('change')
* and avoid this hijacking.
*/
var djangoDismissAddRelatedObjectPopup = window.dismissAddRelatedObjectPopup || window.dismissAddAnotherPopup;
window.dismissAddRelatedObjectPopup = function(win, newId, newRepr) {
// Iff this is an ajax-select input then close the window and
// trigger didAddPopup
var name = window.windowname_to_id(win.name);
我在 Django 目录的任何地方都找不到函数 windowname_to_id(),但是在 djangoprojects.com 的 10 岁 ticket 中,这个函数是为 RelatedObjectLookups.js:
var uniqueness=(new Date()).valueOf();
function id_to_windowname(text) {
text = text.replace(/\./g, '__dot__');
text = text.replace(/\-/g, '__dash__');
return uniqueness + text;
}
function windowname_to_id(text) {
text = text.replace(uniqueness, '');
text = text.replace(/__dot__/g, '.');
text = text.replace(/__dash__/g, '-');
return text;
}
我曾尝试将这些功能勉强放入 ajax_select.js,但没有帮助。
没有 DAS,+add 按钮工作正常。
有解决问题的办法吗?
或者可能有人有 django-ajax-selects with add 功能的工作示例?
问题已由DAS开发者解决,详见issue
简而言之:django-ajax-selects 可以很好地过滤现有项目,但添加新项目时会出现 JS 错误。
详情。使用 Django 3.1。 在管理站点,需要使用 ForeignField 创建模型 Choice 的对象来模拟问题。 Django-ajax-selects(DAS) 用于填充字段(动态过滤)。通过键入字母,DAS 处理查询集并输出相关问题的列表。可以从列表中选择一个问题并保存新的选择。这一切都很好。
如果通过键入没有找到合适的问题,则可以单击“+添加”按钮并在带有表单的弹出窗口 window 中添加新问题。 根据 DAS 文档单击 'Save' 后:
- 新问题必须保存到数据库中;
- 弹窗window必须关闭;
- 必须用新问题填充编辑的字段。
Screenshot with popup window
问题是 Django 在第 2 步停止:创建了新问题,弹出窗口 window 变得空白,并且没有在头部显示“Popup closing ...”关闭。 window:
中存在 JS 错误 Uncaught TypeError: window.windowname_to_id is not a function
at window.dismissAddRelatedObjectPopup (:8000/static/ajax_select/js/ajax_select.js:194)
at popup_response.js:13
空白页的HTML-代码为
<!DOCTYPE html>
<html>
<head><title>Popup closing…</title></head>
<body>
<script id="django-admin-popup-response-constants"
src="/static/admin/js/popup_response.js"
data-popup-response="{"value": "6", "obj": "Question object (6)"}">
</script>
</body>
</html>
这里是一段来自ajax_select.js的JS代码,可能出现错误的地方:
/* Called by the popup create object when it closes.
* For the popup this is opener.dismissAddRelatedObjectPopup
* Django implements this in RelatedObjectLookups.js
* In django >= 1.10 we can rely on input.trigger('change')
* and avoid this hijacking.
*/
var djangoDismissAddRelatedObjectPopup = window.dismissAddRelatedObjectPopup || window.dismissAddAnotherPopup;
window.dismissAddRelatedObjectPopup = function(win, newId, newRepr) {
// Iff this is an ajax-select input then close the window and
// trigger didAddPopup
var name = window.windowname_to_id(win.name);
我在 Django 目录的任何地方都找不到函数 windowname_to_id(),但是在 djangoprojects.com 的 10 岁 ticket 中,这个函数是为 RelatedObjectLookups.js:
var uniqueness=(new Date()).valueOf();
function id_to_windowname(text) {
text = text.replace(/\./g, '__dot__');
text = text.replace(/\-/g, '__dash__');
return uniqueness + text;
}
function windowname_to_id(text) {
text = text.replace(uniqueness, '');
text = text.replace(/__dot__/g, '.');
text = text.replace(/__dash__/g, '-');
return text;
}
我曾尝试将这些功能勉强放入 ajax_select.js,但没有帮助。 没有 DAS,+add 按钮工作正常。
有解决问题的办法吗? 或者可能有人有 django-ajax-selects with add 功能的工作示例?
问题已由DAS开发者解决,详见issue