在django admin中,我有模型A与模型B的外键关联。模型B的值根据模型A的值而变化。
当选择Model B对象与Model A对象关联时,我想立即根据Model A的当前值显示Model B的更新值。
我知道我可以覆盖表单中的on_save方法,以便在用户将表单保存到数据库时更新值。但是,我希望管理员视图在用户点击保存之前显示值。
我需要做些什么来实现此更新?
谢谢
答案 0 :(得分:3)
如果要在用户交互过程中(即:提交之前)在变更视图中动态过滤模型B值,则需要使用javascript:
1)页面呈现后,在“模型A”输入字段上附加“更改处理程序”
2)在该处理程序中,通过Ajax调用一个视图,以根据模型A的当前选定值来检索模型B可用的值列表。
3)收到列表后,相应地更新Model B输入字段
4)此外,在初始页面呈现之后,您应显式调用处理程序,以正确初始化Model B输入字段
这同时适用于“添加”和“更改”视图。
我确实相信可以在这里找到有关如何执行此过程的非常详细的教程:
该示例引用了前端视图,但可以轻松地适应管理员更改视图
答案 1 :(得分:2)
让我们在这里说一下您对模型有什么:
# 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时将其回发到服务器,但我认为这是您想要的。