В моем 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 использовали его, и я возвращал содержимое файла