У меня есть модель, в которой хранятся различные типы данных (дискретные или непрерывные значения) в одном поле (с типом в другом). В ModelForm для этой модели у меня есть ChoiceField, чтобы выбрать элемент данных, и либо ChoiceField, либо DecimalField, чтобы установить значение элемента.реагировать на действия пользователя в форме администратора django?
Когда я создаю форму, я устанавливаю поле для значения в соответствии с типом элемента. Но если я выберу элемент другого типа, я хотел бы сразу изменить поле значения для соответствия.
Я не могу найти способ ответить на изменение, пока форма все еще активна, т. Е. Когда пользователь меняет значения полей, но не нажал кнопку «Отправить». Есть ли способ сделать это? Предпочтительно оставаться на 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