Для ограничения выбора в поле в зависимости от другого поля в Django форме можно использовать функционал DynamicChoiceField. Это позволяет динамически изменять списки выбора в зависимости от значений других полей.
Для начала, определим класс формы в Django, который будет содержать оба поля:
from django import forms class MyForm(forms.Form): field1 = forms.CharField(label='Field 1') field2 = forms.ChoiceField(label='Field 2') def __init__(self, *args, **kwargs): super(MyForm, self).__init__(*args, **kwargs) # Добавляем заглушку для выбора в поле 2 self.fields['field2'].choices = [('', '---------')] def clean(self): cleaned_data = super(MyForm, self).clean() field1_value = cleaned_data.get('field1') # Определяем список выбора для поля 2 в зависимости от значения поля 1 if field1_value == 'value1': choices = [('value1_opt1', 'Option 1'), ('value1_opt2', 'Option 2')] elif field1_value == 'value2': choices = [('value2_opt1', 'Option 1'), ('value2_opt2', 'Option 2')] else: choices = [] self.fields['field2'].choices = choices return cleaned_data
В данном примере мы определили два поля - поле 1 (field1
) типа CharField и поле 2 (field2
) типа ChoiceField. В конструкторе формы мы инициализируем поле 2 заглушкой ([('', '---------')]
), чтобы показать пользователю, что выбор ограничен.
Метод clean()
вызывается после валидации формы и позволяет динамически обновить список выбора для поля 2. В зависимости от значения поля 1 (field1
), мы определяем выбор для поля 2 (field2
). В данном примере, если field1
имеет значение 'value1'
, то выбор в field2
будет ограничен опциями 'Option 1'
и 'Option 2'
. Аналогично, если field1
имеет значение 'value2'
, выбор будет ограничен опциями 'Option 1'
и 'Option 2'
. Если значение field1
не соответствует ни одному из указанных вариантов, выбор для поля 2 будет пустым.
Таким образом, при каждом изменении значения в поле 1, Django будет автоматически обновлять список выбора в поле 2, что позволит ограничить выбор в поле в зависимости от другого поля в Django форме.