繁体   English   中英

(Django)如何在更改外键下拉列表后使“选定”选项有效?

[英](Django) How do I make the 'selected' option valid after altering a foreign key drop-down?

我有一个 model,其字段是日期和另一个模型文本字段的外键:

# 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'
    )

在该 model 的管理“添加”页面上,我添加了 Javascript 以便当我 select 的日期为日期的日历选择器文章 FK 小部件的date子集时,将自动限制为下拉选择器文章 FK 的子集当天发表。 这是通过清除下拉选择器,然后用对后端视图的 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 过滤的标题集之一,我可以 select “保存”并且出版物条目(日期和文章 FK)将成功保存到数据库.

我遇到的问题是,如果我不手动 select 按日期过滤后下拉菜单中的文章 - 例如,如果新的过滤下拉列表中显示的第一个标题是我想要的 - - 我尝试 select 保存,页面重新加载,提示“请更正下面的错误”,并且标题下拉列表中出现错误“选择一个有效的选择。该选择不是可用的选择之一。” 该行为是第一个选项所独有的,默认情况下显示的那个; 即使我打开下拉菜单并手动单击该选项也会发生这种情况,并且无论我是否给它“选定”属性都会发生这种情况。 正如我上面提到的,如果我打开下拉菜单和 select 任何其他选项,页面工作正常。

我已将错误消息跟踪到主 Django 安装中的django/forms/models.pyModelChoiceField() class。 但是,我不确定 go 从这里到哪里。 我不仅不想更改 Django 本身的文件,我不知道该怎么做。 我无法弄清楚我可以在自己的应用程序中进行哪些更改以使默认文章选择有效。

我可以做出的一个猜测是,管理员被编程为始终将 FK 下拉列表中的第一个值视为占位符选项,例如“-----”。 这是真的吗,有没有办法通过我的应用程序admin.py中的设置来禁用它? 我尝试寻找有关此的文档,但找不到任何文档。

否则,如何在更改下拉内容后将外键下拉列表的默认选择设为“有效选择”?

编辑:我已经决定将第一个选项保留为指示已完成过滤的无效选项更好的用户体验,所以这个问题对我的目的来说没有实际意义。 但是,我认为“Django 管理员是否总是将 FK 下拉列表中的第一个值视为占位符选项,有没有办法禁用它?”的根本问题? 是一个很好的问题,所以我将保持开放状态。

您的错误非常微妙:您将第一个选项的值设置为 0。外键从 1 开始......因此选项值 0 永远不会出现在 Model 选项中。 而且您可能会发现所选文章与标题不对应(或只是偶然)。

您应该向 ajax(或具有“id”和“title”的对象)提供 2 元组列表,然后创建 opt.value = data.id。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM