Получение значений .csv без сохранения
Сейчас я загружаю .csv файл через форму модели, сохраняю его в модели, а затем читаю/сохраняю все значения из .csv в другой модели.
После получения всех значений в другой модели .csv не нужен, поэтому я пытался найти способ просто прочитать .csv и получить значения без сохранения в модели.
Ниже приведены основы моей точки зрения.
Буду признателен за любые советы.
def ncaab_csv(request):
form = CsvUpload(request.POST or None, request.FILES or None)
if request.method == "POST":
if form.is_valid():
form.save()
# Get the submitted csv file
games_file = Csv.objects.get(games_entered=False)
with open(games_file.file_name.path, 'r') as f:
reader = csv.reader(f)
for i, row in enumerate(reader):
if i == 0:
pass
else:
try:
game = NCAABGame.objects.get(name__name=row[1],
updated=False,
date=today)
All NCAABGame fields here...
game.save()
return redirect(reverse('ncaab_games'))
else:
messages.error(request, "Failed to save file.")
else:
template = 'management/ncaab/ncaab_csv.html'
context = {
'form': form,
}
return render(request, template, context)
Я нашел решение, размещаю для тех, кто еще ищет способ.
Я создал form.Form и FormView, затем обработал .csv в моем forms.py.
forms.py
import io
import csv
class CsvUpload(forms.Form):
data_file = forms.FileField()
def process_data(self):
f = io.TextIOWrapper(self.cleaned_data['data_file'].file)
reader = csv.DictReader(f)
for row in reader:
game = NCAABGame.objects.get(
name__name=row['name'], updated=False, date=today)
game.field_goals = row['field_goals']
game.fg_attempts = row['fg_attempts']
More data saved to NCAABGame model...
game.save()
views.py
from django.views.generic.edit import FormView
class CsvView(FormView):
template_name = 'management/ncaab/ncaab_csv.html'
form_class = CsvUpload
success_url = '/management/ncaab_games/'
def form_valid(self, form):
form.process_data()
messages.success(self.request, 'Successfully processed games!')
return super().form_valid(form)
.html
<form method="post">
{% csrf_token %}
{{ forms.form.as_p }}
<input type="submit" value="submit"/>
</form>