python - rutas - ¿Cómo obtengo una ruta absoluta de archivos después de haber sido cargada en Django?
que es un directorio en python (1)
Quiero subir un archivo a mi base de datos y, una vez cargado, importarlo y eventualmente exportar los datos a mi base de datos. Tengo la carga funcionando bien, pero no estoy seguro de cómo obtener la ruta absoluta del archivo después de que se cargue. Puedo imprimir el nombre del documento, pero si el mismo nombre del documento se carga, se agrega pero aún muestra el nombre del archivo original si llamo a form.cleaned_data[''document''].name
. ¿Qué puedo hacer para obtener la ruta de archivo absoluta y luego llamar a una función para comenzar a procesar este archivo?
Entonces, esto es lo que quiero hacer:
- El usuario carga un archivo .csv
- El archivo se guarda en db (con una descripción y una ruta de archivo. La ruta del archivo se almacena correctamente en db)
- Obtener la ubicación del archivo que acaba de subir
- Comience a procesar este archivo para convertir los datos .csv y almacenar en la base de datos
models.py
from django.db import models
# Create your models here.
class Document(models.Model):
description = models.CharField(max_length=255, blank=True)
document = models.FileField(upload_to=''documents/'')
uploaded_at = models.DateTimeField(auto_now_add=True)
views.py
from django.shortcuts import render, redirect
from django.views import View
# Create your views here.
from .forms import DocumentForm
from .models import Document
class FileUpload(View):
def post(self, request):
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
print()
print(form.cleaned_data[''document''].name)
form.save()
return redirect(''main_db_model:home'')
else:
return render(request, ''file_upload_form.html'', {
''form'': form
})
def get(self, request):
form = DocumentForm()
return render(request, ''file_upload_form.html'', {
''form'': form
})
forms.py
from django import forms
from .models import Document
class DocumentForm(forms.ModelForm):
class Meta:
model = Document
fields = (''description'', ''document'', )
file_upload_form.html (plantilla):
{% extends "base.html" %}
{% block content %}
<form method="post" enctype="multipart/form-data">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">Upload</button>
</form>
{% if saved %}
<strong>Your profile was saved.</strong>
{% endif %}
This is the form page
<p><a href="{% url ''main_db_model:home'' %}">Return to home</a></p>
<p>Uploaded files:</p>
<ul>
{% for obj in documents %}
<li>
<a href="{{ obj.document.url }}">{{ obj.document.name }}</a>
<small>(Uploaded at: {{ obj.uploaded_at }})</small>
{{ obj.document.url }}
</li>
{% endfor %}
</ul>
{% endblock %}
Anteriormente, le sugiero que cambie esto upload_to=''documents/''
a upload_to=''documents/%Y/%m/%d''
, ¿por qué? esto para manejar archivos de documentos enormes dentro de su ruta de documents/
.
form.cleaned_data[''document'']
(o request.FILES[''document'']
) devuelve un objeto UploadedFile
. por supuesto form.cleaned_data[''document''].name
debe devolver un nombre solamente.
class FileUpload(View):
def post(self, request):
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
# this `initial_obj` if you need to update before it uploaded.
# such as `initial_obj.user = request.user` if you has fk to `User`,
# if not you can only using `obj = form.save()`
initial_obj = form.save(commit=False)
initial_obj.save()
# return path name from `upload_to=''documents/''` in your `models.py` + absolute path of file.
# eg; `documents/filename.csv`
print(initial_obj.document)
# return `MEDIA_URL` + `upload_to` + absolute path of file.
# eg; `/media/documents/filename.csv`
print(initial_obj.document.url)
form.save()
Pero obtendrá una diferente si usa upload_to=''documents/%Y/%m/%d''
,
print(initial_obj.document) # `documents/2017/02/29/filename.csv`
print(initial_obj.document.url) # `/media/documents/2017/02/29/filename.csv`