В исходном коде 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', )