В чем преимущество formset со встроенным в django - admin.py? - PullRequest
0 голосов
/ 25 февраля 2019

В исходном коде django есть две модели DfHeaderInfo, DfInpValidation, которые я пытаюсь понять.Обе эти модели имеют внешний ключ к другой модели DfInpAdmin.Обе эти модели представлены в виде таблицы в основной форме DfInpAdmin.Но в admin.py я вижу DfHeaderInfo, DfHeaderInfoInline, DfHeaderInfoForm и соответствующий набор форм DfHeaderInfoFormSet.Но для DfInpValidation нет соответствующего набора форм.Есть только DfInpValidationForm и DfInpValidationInline.

Я не могу понять, какие требования или специальные функции, которые использует formset, добавляет к DfHeaderInfo?Я могу обновить обе модели с DfInpAdmin аналогичным образом.Так что же дает дополнительный набор форм?

            class DfHeaderInfoFormSet(BaseInlineFormSet):
                def get_form_kwargs(self, index):
                    kwargs = super().get_form_kwargs(index)
                    kwargs['parent_object'] = self.instance
                    return kwargs

            class DfHeaderInfoForm(forms.ModelForm):
                class Meta:
                    model = DfHeaderInfo
                    fields = "__all__"

                def __init__(self, *args, parent_object, **kwargs):

                    try:
                        self.parent_object = parent_object
                        print(self.parent_object)
                        self.df_inp_fk = self.parent_object.df_inp_pk
                        super(DfHeaderInfoForm, self).__init__(*args, **kwargs)
                        self.fields['alias'] = forms.CharField(
                                widget=forms.TextInput(attrs={'size': 30}),
                                label="Alias Name",
                                help_text='Alias of XPATH/Header)',
                                required=False)
                        self.fields['expression'] = forms.CharField(
                                widget=forms.TextInput(attrs={'size': 30}),
                                label="Expression",
                                help_text='Expression for XPATH/Header)',
                                required=False)                    
                    except ObjectDoesNotExist as e:
                        super(DfHeaderInfoForm, self).__init__(*args, **kwargs)
                def clean(self):
                    cleaned_data = self.cleaned_data
                    alias = self.cleaned_data.get("alias")
                    if not alias:
                        raise forms.ValidationError("Alias cannot be Blank")
                       return cleaned_data    

            class DfHeaderInfoInline(PaginationInline):
                model = DfHeaderInfo
                extra = 0
                formset = DfHeaderInfoFormSet
                form = DfHeaderInfoForm
                fk_name = 'df_inp_fk'
                list_display = ('alias', 'expression',)

            class DfInpValidationForm(forms.ModelForm):
                class Meta:
                    model = DfInpValidation
                    fields = "__all__"
                    widgets = {
                        'validation_name':
                        forms.TextInput(attrs={'size': 20}),
                        'inp_param':
                        forms.TextInput(attrs={'size': 50})
                    }
                def __init__(self, *args, **kwargs):
                    super(DfInpValidationForm, self).__init__(*args, **kwargs)
                    if self.instance:
                        self.fields['df_validation_fk'].queryset = DfValidation.objects.filter(validation_type__icontains='DFINPCHECK')

            class DfInpValidationInline(admin.TabularInline):
                model = DfInpValidation
                extra = 0
                form = DfInpValidationForm
                fk_name = 'df_inp_fk'
                list_display = ('df_validation_fk', 'validation_name','inp_param')
                fields = (
                    'df_validation_fk',
                    'validation_name',
                    'inp_param', )
...