依赖于模型的 Django 小部件



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

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

现在我想再次写入此字段,如果模型(此处称为 Order)将其字段类型设置为整数值 0。

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

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

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

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

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

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

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

最新更新