簡體   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