依赖于模型的 Django 小部件
Django widget that depends on model
我是 django 的新手,有一个问题。我使用 Widgets 得到了一个 ModelForm。由于我有一个名为 discount
的字段,如果显示的模型满足某些要求,我只想对其进行编辑,因此我使用小部件条目将其设为只读:
class Meta:
widgets = {'discount': forms.TextInput(attrs={'readonly': True})}
现在我想让再次写入该字段成为可能,前提是模型(此处称为订单)的字段类型设置为整数值 0。
我尝试在 html 模板中这样做,但失败了。
所以我的下一个想法是让小部件以某种方式依赖于它显示的模型,所以有点伪代码:
class Meta:
widgets = {'discount': forms.TextInput(attrs={'readonly': currentModel.type == 0})}
有没有正确的方法来做这样的事情?
提前致谢
除非您在创建表单时定义模型实例,否则您拥有的是通用模型定义,而不是模型实例。
看起来您可能想在用户交互后更改表单行为,为此您必须使用 javascript.
您可以覆盖 __init__
的模型表单 class 以修改小部件:
class MyModelForm(...):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs):
instance = kwargs['instance']
self.fields['discount'].widget.attrs['readonly'] = instance.type == 0
可能值得注意的是,将小部件设置为只读并不能阻止恶意用户无论如何修改该字段。确保在服务器端正确验证。
我是 django 的新手,有一个问题。我使用 Widgets 得到了一个 ModelForm。由于我有一个名为 discount
的字段,如果显示的模型满足某些要求,我只想对其进行编辑,因此我使用小部件条目将其设为只读:
class Meta:
widgets = {'discount': forms.TextInput(attrs={'readonly': True})}
现在我想让再次写入该字段成为可能,前提是模型(此处称为订单)的字段类型设置为整数值 0。
我尝试在 html 模板中这样做,但失败了。 所以我的下一个想法是让小部件以某种方式依赖于它显示的模型,所以有点伪代码:
class Meta:
widgets = {'discount': forms.TextInput(attrs={'readonly': currentModel.type == 0})}
有没有正确的方法来做这样的事情? 提前致谢
除非您在创建表单时定义模型实例,否则您拥有的是通用模型定义,而不是模型实例。 看起来您可能想在用户交互后更改表单行为,为此您必须使用 javascript.
您可以覆盖 __init__
的模型表单 class 以修改小部件:
class MyModelForm(...):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs):
instance = kwargs['instance']
self.fields['discount'].widget.attrs['readonly'] = instance.type == 0
可能值得注意的是,将小部件设置为只读并不能阻止恶意用户无论如何修改该字段。确保在服务器端正确验证。