Почему бы не сделать это, как вы уже начали, через валидатор файла, поскольку аргумент validators поддерживает список валидаторов, которые будут выполняться в указанном порядке. Или, если вы не хотите включать его в модель, вы можете создать форму и определить поле файла со списком валидаторов так же, как это определено в моделях.
def validate_doc(value):
f = value.read()
# do logic
return value
class MyDocument(models.Model):
description = models.CharField(max_length=255, blank=True)
document = models.FileField(
upload_to='documents',
validators=[FileExtensionValidator(['csv', ]), validate_doc]
)
или
class DocumentForm(forms.ModelForm):
description = forms.CharField(
label='comment',
widget=forms.TextInput(attrs={'placeholder': 'comment'})
)
document = forms.FileField(validators=[validate_doc])
class Meta:
model = MyDocument
fields = {'description', 'document'}
или удалите поле документа из формы и подтвердите его с помощью метода имени clean_field
class DocumentForm(forms.ModelForm):
# ...
def clean_document(self):
doc = self.cleaned_data['document']
f = doc.read()
# do logic
return doc