取决于模型的Django小部件

时间:2019-01-10 14:18:58

标签: django django-models django-forms django-templates django-widget

我对Django很陌生,并且有一个问题。我有一个使用小部件的ModelForm。由于我有一个名为discount的字段,我只希望在显示的模型满足某些要求时才可以对其进行编辑,因此我使用小部件条目将其设置为只读:

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

现在,如果模型(这里称为Order)的字段类型设置为整数值0,那么我想再次写入该字段。

我试图在html模板中这样做,但是失败了。 因此,我的下一个想法是使窗口小部件某种程度上依赖于其显示的模型,因此使用一种伪代码:

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

有没有做这种事情的正确方法? 预先感谢

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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

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