Cześć wszystkim,
Pisze aplikacje web która ma przerobić uploadowany plik .xlsx za pomocą skryptu PANDAS.
Chciałbym aby aplikacja działała tak:
- Widok „excle_file” – tu user uploaduje plik .xlsx
def excle_upload(request):
if request.method =='POST':
# Czy to w tym miejscu powinna
# być napisana logika która przepuszcza
# file przez skrypt pandas
# i wkłada go do formy w miejsce request.FILE
# ???
form = ExcleForm(request.POST, request.FILES)
if form.is_valid():
form.save()
return redirect('excle_list')
else:
form = ExcleForm()
2.Skrypt pandas przerabia plik .xlsx do żądanej postaci (czyli logika + skrypt pandas chyba musi być także w widoku „excle_file” ??? ) Skrypt zaczyna się tak:
df = pd.read_excel(os.path.join(path,filename)) # tutaj file przslany przez usera
df.loc[:,"ODOMETER_FW"] = df.loc[:,"ODOMETER_FW"].fillna(0).astype('int')
df.dropna(inplace = True)
df.sort_values(by=['VEHICLE_ID_FW','TRANSACTION_DATE_FW','TRANSACTION_TIME_FW'], ascending=[True,False,False],inplace=True)
df['ODOMETER_FW'] = df['ODOMETER_FW'].apply(lambda x: 0 if x <1000 else x)
df.set_index(['VEHICLE_ID_FW'], inplace=True)
3. Widok „excle_list” – ma zawierać już przerobione pliki i daje możliwość ich ściągnięcia
def excle_list(request):
files = Excel.objects.all()
return render(request, 'odo_correction/excle_list.html', {'files':files})
Obecnie mam napisane funkcjonalności z pkt 1 i 3 no i oczywiście gotowy skrypt pandas. Aplikacja działa tak, że mogę uploadowac i następnie pobierać dokładnie ten sam plik. (cel to jednak pkt 3). Próbuje dostać się do pliku grzebiąc gdzieś w request.FILES ale mam 2 problemy:
- jak zrobić aby klasa: InMemoryUploadedFile – stała się plikiem excel możliwym do użycia jako DataFrame ?
- jak włożyć przerobiony plik z inputa do zaimplementowanej formy „ExcleForm”
Dodatkowo zamieszczę jeszcze w kolejności: model , forme i formularz uploadu html:
#models.py
class Excel(models.Model):
country = models.CharField(default= "", max_length = 20)
file = models.FileField(upload_to ='excel')
def __str__(self):
return self.file.name
def delete(self, *args, **kwargs):
self.file.delete()
super().delete(*args, **kwargs)
# form.py
class ExcleForm(forms.ModelForm):
class Meta:
model = Excel
fields = ('country','file')
{% extends 'odo_correction/base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<h2> Upload .xlsx ODO file</h2>
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form|crispy }}
<button type="submit" class="btn btn-primary">Upload File</button>
</form>
{% endblock %}
Jeśli ktoś ma jakieś doświadczenie tego typu problemie, to bardzo proszę o pomoc, gdzie szukać informacji i czym się kierować?
Dziękuje i Pozdrawiam!