Удалите объект файла формы после сохранения или откройте файл перед сохранением формы - PullRequest
0 голосов
/ 15 марта 2020

Что я хочу, это как показано ниже

загрузить файл -> проверить -> сохранить в дБ.

form = DocumentForm(request.POST, request.FILES)

form.save() # real file stored in directory

#open file and validate..

df = pd.read_csv(form.document.path)

if validate(df):
 pass:
else:
 form.remove() # error occurs "DocumentForm object has no attribute 'remove'"

Тогда у меня есть две идеи.

Есть ли способ удалить объект в model из Form объекта ???

или

Есть ли способ открыть файл, прежде чем он будет сохранен в каталоге ?? ?

Мои form и model классы ниже

class DocumentForm(forms.ModelForm):
    description = forms.CharField(label='comment',widget=forms.TextInput(attrs={'placeholder': 'comment'}))
    class Meta:
        model = MyDocument
        fields = {'description','document'}

class MyDocument(models.Model):
    description = models.CharField(max_length=255, blank=True)
    document = models.FileField(upload_to='documents'
    ,validators=[FileExtensionValidator(['csv', ])]
    )

1 Ответ

1 голос
/ 15 марта 2020

Почему бы не сделать это, как вы уже начали, через валидатор файла, поскольку аргумент 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...