(Django)更改外键下拉菜单后如何使'selected'选项有效?

时间:2020-07-13 12:23:55

标签: javascript django django-admin

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

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

在该模型的管理“添加”页面上,我添加了Javascript,以便从date的日历选择器小部件中选择日期时,Articles 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);
}

如果在选择日期并观看了标题下拉列表后进行了相应过滤,则我选择了一组过滤的标题,则可以选择“保存”,并且出版物条目(日期和FK条目)将保存到数据库成功。

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

我已在主要Django安装中将错误消息跟踪到ModelChoiceField()的{​​{1}}类。但是,我不确定从这里去哪里。我不仅不希望在Django本身中更改文件,而且我也不知道该怎么做。我无法弄清楚我可以在自己的应用程序中进行哪些更改以使默认的文章选择有效。

我可以猜测的是,管理员已编程为始终将FK下拉列表中的第一个值视为占位符选项,例如“ -----”。这是真的吗,是否可以通过应用程序django/forms/models.py中的设置来禁用它?我试图为此寻找文档,但是找不到。

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

编辑:我认为最好将第一个选项保留为无效选项,以表明进行了哪些过滤,这对于我来说是个难题。但是,我认为存在一个潜在的问题:“ Django Admin是否始终将FK下拉列表中的第一个值视为占位符选项,是否可以禁用它?”是个好问题,所以我将其保留。

1 个答案:

答案 0 :(得分:1)

您的错误很细微:将第一个选项的值设置为0。外键从1开始...因此,选项值0永远不会出现在“模型”选项中。您可能会发现所选文章与标题不符(或偶然)。

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