【发布时间】:2016-04-18 20:55:40
【问题描述】:
我有一个模型,它将不同类型的数据(离散或连续值)存储在一个字段中(类型在另一个字段中)。在该模型的 ModelForm 中,我有一个 ChoiceField 来选择数据项,还有一个 ChoiceField 或 DecimalField 来设置项的值。
当我创建表单时,我根据项目的类型设置值的字段。但是如果我选择不同类型的项目,我想立即更改值字段以匹配。
当表单仍处于活动状态时,即用户正在更改字段值但尚未单击“提交”按钮时,我无法响应更改。有没有办法做到这一点?最好留在服务器上的 Python 中,而不是在浏览器端用 javascript 对其进行编码。
ChoiceField 的选项取自模型,因此不能在任何地方硬编码。
这里有一些代码:
class FooProperty (models.Model):
foo = models.ForeignKey ('foos.Foo')
prop = models.ForeignKey ('foos.FooProperty')
value = models.DecimalField (max_digits=15, decimal_places=6) # is an EnumValue id in the case of discrete values.
class FooPropertyForm (forms.ModelForm):
class Meta:
model = FooProperty
fields = ['prop', 'value']
def __init__(self, *args, **kwargs):
super (FooPropertyForm, self).__init__(*args, **kwargs)
if hasattr (self.instance, 'prop'):
kind = self.instance.prop.units.kind
if kind.id != 1:
values = [(v.id, v.name) for v in EnumValues.objects.filter (kind=kind.id)]
self.fields ['value'] = forms.ChoiceField (choices=values, required=True)
self.initial['value'] = int(self.instance.value) # using initial= above doesn't work.
else:
# keep the default field.
pass
【问题讨论】:
标签: django django-forms django-admin