依赖于模型的 Django 小部件

Posted

技术标签:

【中文标题】依赖于模型的 Django 小部件【英文标题】:Django widget that depends on model 【发布时间】:2019-06-05 10:34:00 【问题描述】:

我对 django 很陌生,有一个问题。我得到了一个使用小部件的 ModelForm。由于我有一个名为 discount 的字段,我只想在显示的模型满足某些要求时对其进行编辑,因此我使用小部件条目将其设为只读:

class Meta: widgets = 'discount': forms.TextInput(attrs='readonly': True)

现在我想让再次写入该字段成为可能,前提是模型(此处称为订单)的字段类型设置为整数值 0。

我尝试在 html 模板中这样做,但失败了。 所以我的下一个想法是让小部件以某种方式依赖于它显示的模型,所以有点伪代码:

class Meta: widgets = 'discount': forms.TextInput(attrs='readonly': currentModel.type == 0)

有没有合适的方法来做这样的事情? 提前致谢

【问题讨论】:

【参考方案1】:

您可以覆盖模型表单类的__init__ 来修改小部件:

class MyModelForm(...):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs):
        instance = kwargs['instance']
        self.fields['discount'].widget.attrs['readonly'] = instance.type == 0

可能值得注意的是,将小部件设置为只读并不能阻止恶意用户修改该字段。确保在服务器端正确验证。

【讨论】:

【参考方案2】:

除非您在创建表单时定义模型实例,否则您将拥有通用模型定义,而不是模型实例。 看起来您可能希望在用户交互后更改表单行为,为此您必须使用 javascript

【讨论】:

以上是关于依赖于模型的 Django 小部件的主要内容,如果未能解决你的问题,请参考以下文章

Django ForeignKey 表单字段小部件

如何在 Select 小部件中构造带有模型对象的 Django 表单?

Django - 时间范围小部件

依赖于另一个小部件值的 Dojo 验证

Django 中的复杂表单小部件

Django 2.0 ModelForm dateField 不显示为小部件