Оптимизировать открытие файла в Django (метод очистки и атрибутов) - PullRequest
0 голосов
/ 11 апреля 2020

В моем forms.py у меня есть метод clean (). Чистый метод делает много вещей. Он открывает файл, проверяет заголовки, проверяет содержимое et c et c. Работает нормально.

forms.py

class BatchFileUploadForm(forms.Form):
    csv_file = FileField(label='CSV File', required=False)        

    def __init__(self, *args, **kwargs):
        super(BatchFileUploadForm, self).__init__(*args, **kwargs)
        self.fields['csv_file'].widget = CustomButtonFileWidget()
        self.fields['csv_file'].help_text = 'Upload a CSV file which contains the results'

    def clean(self):
        uploaded_csv_file = self.cleaned_data['csv_file']
        allowed_headers = {'id','name','approve','reject'}
        validation_errors = []

        if not uploaded_csv_file.name.endswith(settings.FILE_UPLOAD_TYPE):
            raise forms.ValidationError("Please upload .csv extension files only")

        csvin = csv.DictReader(StringIO(uploaded_csv_file.read().decode('utf-8')))
        # lowercase all fieldnames before doing anything else
        csvin.fieldnames = [name.lower() for name in csvin.fieldnames]

После очистки файла я хочу сохранить содержимое файла. Поэтому в view.py мне нужно снова открыть файл

view.py

def upload_batch(request):

    fileList= []
    approved_count = 0
    rejected_count = 0

    form = BatchFileUploadForm(
                data=(request.POST or None),
                files=(request.FILES or None)
            )
    if(form.is_valid()):
        uploaded_csv_file = request.FILES['csv_file']
        csvin = csv.DictReader(StringIO(uploaded_csv_file.read().decode('utf-8')))
        # lowercase all fieldnames before doing anything else
        csvin.fieldnames = [name.lower() for name in csvin.fieldnames]

        for row in csvin:
            fileList.append(row)
            if row['approve'] == 'x':
                approved_count+=1
            if row['reject'] =='x':
                rejected_count+=1 

# putting fileList in session so it can be accessed in the second method save() 

    return render(request, "file/confirm_save.html", 
{'form': form, 'fileList':fileList,
'approved_count': approved_count, 
'rejected_count': rejected_count})

Я чувствую, что нет необходимости открывать файл 2 раза с одной и той же строкой кода. Есть ли способ изменить код, чтобы я открывал файл только один раз, а затем оба метода clean использовали его, и я возвращал содержимое файла

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...