Я изо всех сил пытался нормализовать несколько таблиц / моделей, которые у меня есть в Django, которые должны использоваться в одной большой форме.
Скажем, у меня есть 2 формы, основанные на 2 моделях, одна из которых являетсязависит от другого.Есть ли способ добавить проверки формы в 1 модель, когда конкретный выбор сделан в другой модели?
Данные cleaned_data из 1 недоступны в другой форме, это основная проблема.Я создал обе формы в одном и том же виде.
Таким образом, в основном, в 1 форме мне нужно ссылаться на поля, которые находятся в другой модели (другой modelForm, который создается на той же странице)
Form2 на основе таблицы / model2:
def clean(self):
cleaned_data = super().clean()
if 'model1_field' in cleaned_data and not cleaned_data['model2_field']:
self.add_error('model2_field', forms.ValidationError('This field is required.'))
else:
print('No validations are needed')
Более подробная информация о зависимости (попытка следовать концепциям нормализации БД), и есть множество полей, которые требуются в model2, только когда 'selection2'или 'is_option1' из model1 выбрано.
--- Models------
MULTI_OPTIONS = (
('selection1', 'selection1'),
('selection2', 'selection2') # Display and make model2 required
)
class Model1(models.Model):
primary_key = models.CharField(db_column='primary_table1_key', max_length=10) # Maps tocommon key for all related tables
is_selected = models.BooleanField(db_column='IsSelected', blank=True, default=None)
multi_select_options = MultiSelectField(db_column='SelectedOptions', max_length=150, choices = MULTI_OPTIONS, blank=True, null=True)
is_option1 = models.BooleanField(db_column='IsOption1', blank=True, null=True, default=None) # No validations needed for Model1SubOptions
is_option2 = models.BooleanField(db_column='IsOption2', blank=True, null=True, default=None)# If option2 or 'selection2' is made in Model1, then make required sub_selections and all other fields in Model1SubOptions
class Meta:
managed = True
# This should become required if Model1 specific option (from a multiselect (Or) a specific boolean field is set to true)
class Model2(models.Model):
primary_key = models.CharField(db_column='primary_table1_key', max_length=10) # Maps tocommon key for all related tables
sub_selections = MultiSelectField(db_column='SubOptions', max_length=150, choices = (('Some', 'Some'), ('Other','Other')), blank=True, null=True)
other_field2 = models.PositiveIntegerField(db_column='OtherField2', blank=True, null=True)
---------- Forms ---------
class Model1Form(forms.ModelForm):
class Meta:
model = models.Model1
fields = ( 'is_selected', 'multi_select_options', 'is_option1', 'is_option2')
def clean(self):
cleaned_data = super().clean()
if('multi_select_options' in cleaned_data):
multi_select_options = cleaned_data['multi_select_options']
if(not multi_select_options):
self.add_error('multi_select_options', forms.ValidationError('This field is required'))
# if(('selection1' in multi_select_options) and check_data_does_not_exist(cleaned_data, 'model2')):
# Validate model2
class Model2Form(forms.ModelForm):
class Meta:
model = models.Model2
fields = ( 'sub_selections', 'other_field2')
def clean(self):
cleaned_data = super().clean()
# if(('selection1' in multi_select_options) and check_data_does_not_exist(cleaned_data, 'multi_select_options')):
# Validate model2