¿Cómo obtengo una ruta absoluta de archivos después de cargarlos en Django?

Quiero cargar un archivo a mi base de datos y, una vez que se haya cargado, impórtelo y, finalmente, exporte 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 una vez que se haya cargado. Puedo imprimir el nombre del documento, pero si se carga el mismo nombre del documento, se adjunta pero aún muestra el nombre del archivo original si llamo form.cleaned_data['document'].name . ¿Qué puedo hacer para obtener la ruta absoluta del archivo y luego llamar a una función para comenzar a procesar este archivo?

Así que esto es lo que estoy buscando hacer:

  • El usuario carga un archivo .csv
  • El archivo se guarda en db (con una descripción y ruta del archivo. La ruta del archivo se almacena correctamente en db)
  • Obtener la ubicación del archivo que se acaba de cargar
  • Comience a procesar este archivo para convertir los datos .csv y almacenarlos en la base de datos

modelos.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) 

vistas.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 %}  {% csrf_token %} {{ form.as_p }}   {% if saved %} Your profile was saved. {% endif %} This is the form page 

Return to home

Uploaded files:

    {% for obj in documents %}
  • {{ obj.document.name }} (Uploaded at: {{ obj.uploaded_at }}) https://stackoverflow.com/questions/42544523/how-do-i-get-a-files-absolute-path-after-being-uploaded-in-django/{{ obj.document.url }}
  • {% endfor %}
{% endblock %}

Anteriormente, le sugiero que cambie este upload_to='documents/' a upload_to='documents/%Y/%m/%d' , ¿por qué? esto para manejar grandes archivos de documentos 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.

 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 diferencia 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`