Django管理员根据外键模型选择更新表单字段

时间:2017-12-01 03:41:40

标签: django

在django admin中,我有模型A与模型B的外键关联。模型B的值根据模型A的值而变化。

当选择Model B对象与Model A对象关联时,我想立即根据Model A的当前值显示Model B的更新值。

我知道我可以覆盖表单中的on_save方法,以便在用户将表单保存到数据库时更新值。但是,我希望管理员视图在用户点击保存之前显示值。

我需要做些什么来实现此更新?

谢谢

2 个答案:

答案 0 :(得分:3)

如果要在用户交互过程中(即:提交之前)在变更视图中动态过滤模型B值,则需要使用javascript:

1)页面呈现后,在“模型A”输入字段上附加“更改处理程序”

2)在该处理程序中,通过Ajax调用一个视图,以根据模型A的当前选定值来检索模型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

该示例引用了前端视图,但可以轻松地适应管理员更改视图

答案 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时将其回发到服务器,但我认为这是您想要的。