Джанго мульти-форма проверки из разных моделей - PullRequest
0 голосов
/ 11 июля 2019

Я изо всех сил пытался нормализовать несколько таблиц / моделей, которые у меня есть в 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

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете создать форму, которая имеет все поля из обеих моделей, затем вы можете выполнить всю проверку одним чистым методом, а затем ваше представление сможет обработать сохранение отдельных моделей

class CombinedForm(forms.Form):

    # All fields from Model1
    # All fields from Model2

    def clean(self):
        # Do all validation for fields that are dependent on each other


class CombinedView(FormView):

    form_class = CombinedForm

    def form_valid(self, form):
        Model1.objects.create(
            param1=form.cleaned_data['param1'],
            param2=form.cleaned_data['param2'],
        )
        Model2.objects.create(
            param3=form.cleaned_data['param3'],
            param4=form.cleaned_data['param4'],
        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...