(Django) 如何在更改外键 drop-down 后使 'selected' 选项有效?
(Django) How do I make the 'selected' option valid after altering a foreign key drop-down?
我有一个模型,其字段是日期和另一个模型文本字段的外键:
# models.py
class Publications(models.Model):
"""A class for daily article publications"""
date = models.DateField(
help_text="date for this article to be published"
)
headline = models.ForeignKey(
Articles,
help_text='The article to be published, represented by its headline'
)
在该模型的管理 'Add' 页面上,我添加了 Javascript 这样当我 select 从日历 select 或 date
, drop-down selector for the Articles FK 自动限制为当天准备发布的文章子集。这是通过清除 drop-down selector 然后 re-filling 它与 AJAX 调用后端视图的结果来实现的:
// Javascript for Publications "Add" admin page
// Grab the Article <select> element
let artSelect = document.getElementById("id_headline");
// Clear it
artSelect.innerHTML = '';
// Fill it with new <option> elements from 'data', a list of Article
// headlines retrieved via AJAX
for (var i=0; i<data.length; i++) {
var opt = document.createElement('option');
opt.value = i;
opt.innerHTML = data[i];
// If it's the first option, make it 'selected'
if (i == 0) {
opt.setAttribute("selected", "");
}
artSelect.appendChild(opt);
}
如果在 select 确定日期并观察标题后 drop-down 被相应地过滤,我 select 过滤后的一组标题中的一个,我可以 select “保存”和出版物条目(日期和文章FK)将成功保存到数据库中。
我遇到的问题是,如果我在按日期过滤后不手动 select 来自 drop-down 的文章——例如,如果第一个标题显示在新, 过滤 drop-down 是我想要的 -- 我尝试 select 保存,页面重新加载并提示“请更正以下错误”和标题错误 drop-down “Select 一个有效的选择。该选择不是可用的选择之一。”该行为对于第一个选项是唯一的,默认情况下显示;即使我打开 drop-down 并手动单击该选项,它也会发生,无论我是否给它赋予 'selected' 属性,它都会发生。正如我上面提到的,如果我打开 drop-down 和 select 任何其他选项,页面工作正常。
我已将错误消息追溯到主 Django 安装中 django/forms/models.py
的 ModelChoiceField()
class。但是,我不确定从这里去哪里。我不仅不想更改 Django 本身的文件,而且我不知道我会怎么做。我无法弄清楚我可以在自己的应用程序中进行哪些更改以使默认文章 selection 有效。
我可以做出的一个猜测是 Admin 被编程为始终将 FK drop-down 中的第一个值视为占位符选项,例如“-----”。这是真的吗?有没有办法通过我的应用程序 admin.py
中的设置禁用它?我试图寻找有关此的文档,但找不到任何文档。
否则,如何在更改下拉菜单内容后使 Foreign-Key 下拉菜单的默认 selection 成为“有效选择”?
编辑: 我决定将第一个选项保留为 non-valid 选项更好的用户体验,它指示已完成的过滤,所以这个问题没有实际意义为了我的目的。但是,我认为潜在的问题是“Django 管理员是否总是将 FK drop-down 中的第一个值视为占位符选项,有没有办法禁用它?”是个好问题,所以我不提这个问题。
您的错误非常微妙:您将第一个选项的值设置为 0。外键从 1 开始...因此选项值 0 永远不会出现在模型选项中。您可能会发现所选文章与标题不符(或者只是偶然)。
您应该向 ajax(或带有 'id' 和“标题”的 objects)提供一个二元组列表,然后创建 opt.value = data.id.
我有一个模型,其字段是日期和另一个模型文本字段的外键:
# models.py
class Publications(models.Model):
"""A class for daily article publications"""
date = models.DateField(
help_text="date for this article to be published"
)
headline = models.ForeignKey(
Articles,
help_text='The article to be published, represented by its headline'
)
在该模型的管理 'Add' 页面上,我添加了 Javascript 这样当我 select 从日历 select 或 date
, drop-down selector for the Articles FK 自动限制为当天准备发布的文章子集。这是通过清除 drop-down selector 然后 re-filling 它与 AJAX 调用后端视图的结果来实现的:
// Javascript for Publications "Add" admin page
// Grab the Article <select> element
let artSelect = document.getElementById("id_headline");
// Clear it
artSelect.innerHTML = '';
// Fill it with new <option> elements from 'data', a list of Article
// headlines retrieved via AJAX
for (var i=0; i<data.length; i++) {
var opt = document.createElement('option');
opt.value = i;
opt.innerHTML = data[i];
// If it's the first option, make it 'selected'
if (i == 0) {
opt.setAttribute("selected", "");
}
artSelect.appendChild(opt);
}
如果在 select 确定日期并观察标题后 drop-down 被相应地过滤,我 select 过滤后的一组标题中的一个,我可以 select “保存”和出版物条目(日期和文章FK)将成功保存到数据库中。
我遇到的问题是,如果我在按日期过滤后不手动 select 来自 drop-down 的文章——例如,如果第一个标题显示在新, 过滤 drop-down 是我想要的 -- 我尝试 select 保存,页面重新加载并提示“请更正以下错误”和标题错误 drop-down “Select 一个有效的选择。该选择不是可用的选择之一。”该行为对于第一个选项是唯一的,默认情况下显示;即使我打开 drop-down 并手动单击该选项,它也会发生,无论我是否给它赋予 'selected' 属性,它都会发生。正如我上面提到的,如果我打开 drop-down 和 select 任何其他选项,页面工作正常。
我已将错误消息追溯到主 Django 安装中 django/forms/models.py
的 ModelChoiceField()
class。但是,我不确定从这里去哪里。我不仅不想更改 Django 本身的文件,而且我不知道我会怎么做。我无法弄清楚我可以在自己的应用程序中进行哪些更改以使默认文章 selection 有效。
我可以做出的一个猜测是 Admin 被编程为始终将 FK drop-down 中的第一个值视为占位符选项,例如“-----”。这是真的吗?有没有办法通过我的应用程序 admin.py
中的设置禁用它?我试图寻找有关此的文档,但找不到任何文档。
否则,如何在更改下拉菜单内容后使 Foreign-Key 下拉菜单的默认 selection 成为“有效选择”?
编辑: 我决定将第一个选项保留为 non-valid 选项更好的用户体验,它指示已完成的过滤,所以这个问题没有实际意义为了我的目的。但是,我认为潜在的问题是“Django 管理员是否总是将 FK drop-down 中的第一个值视为占位符选项,有没有办法禁用它?”是个好问题,所以我不提这个问题。
您的错误非常微妙:您将第一个选项的值设置为 0。外键从 1 开始...因此选项值 0 永远不会出现在模型选项中。您可能会发现所选文章与标题不符(或者只是偶然)。
您应该向 ajax(或带有 'id' 和“标题”的 objects)提供一个二元组列表,然后创建 opt.value = data.id.