簡體   English   中英

Django管理員根據外鍵模型選擇更新表單字段

[英]Django admin update of form fields based on foreign key model selection

在django admin中,模型A具有與模型B的外鍵關聯。模型B的值基於模型A的值而變化。

當選擇模型B對象與模型A對象關聯時,我想立即根據模型A的當前值顯示模型B的更新值。

我知道我可以覆蓋表單中的on_save方法,以便在用戶將表單保存到數據庫時更新值。 但是,我希望管理員視圖在用戶點擊保存之前顯示值。

我需要做些什么來進行此更新?

謝謝

如果您想在用戶交互期間(即提交前)在changeview中對模型B值進行動態過濾,則需要javascript:

1)在頁面渲染之后,將“更改處理程序”附加到模型A輸入字段

2)在該處理程序中,通過Ajax調用一個視圖,根據當前選擇的Model A值檢索Model B可用的值列表

3)收到列表后,相應地更新Model B輸入字段

4)同樣,在初始頁面渲染之后,您應該顯式調用處理程序,以便正確初始化Model B輸入字段

這應該適用於“添加”和“更改”視圖。

我相信可以在這里找到關於如何實現此過程的非常詳細的教程:

https://simpleisbetterthancomplex.com/tutorial/2018/01/29/how-to-implement-dependent-or-chained-dropdown-list-with-django.html

該示例涉及前端視圖,但可以輕松適應管理員更改視圖

我們在這里說一下你的模特:

# Model B
class ModelB(models.Model):
    pass

# Model A
class ModelA(models.Model):
    b_link = models.ForeignKey(ModelB)

我假設您不想使用javascript來操作表單,而是從服務器解析它。 在這種情況下,您可以做的只是創建preview模型B,並從此模型創建ModelForm
例如:

class ModelB(models.Model):
    ...
    # add a method to preview B - This will not save model
    def preview_b(model_a):
        # update values of b according to model_a
        b.derived_value = model_a.value

# file: forms.py
class ModelBForm(ModelForm):
    class Meta:
        model = ModelB

# file: views.py
b_model = Model.objects.all().first()
b_model.preview_b(a_model)
form = ModelBForm(instance=b_model)

當然,這需要您在選擇新的ModelA時回發到服務器,但我認為這就是您想要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM