[英]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輸入字段
這應該適用於“添加”和“更改”視圖。
我相信可以在這里找到關於如何實現此過程的非常詳細的教程:
該示例涉及前端視圖,但可以輕松適應管理員更改視圖
我們在這里說一下你的模特:
# 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.