Omkar
Omkar

Reputation: 29

Django read file from model, [Errno 2] No such file or directory

In Django I am using model forms to upload .stl file in model shown below. Once I submit form I see files get uploaded to myproject => media directory. But while reading uploaded file from the model, I am keep getting file not found error. I tried using both absolute and relative path without success, any help is much appreciated.

settings.py

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

model.py

from django.db import models

class StlFile(models.Model):
    uploaded_file = models.FileField()
    uploaded_at = models.DateTimeField(auto_now_add=True)
    volume = models.FloatField(default=0.0)

forms.py

from django import forms
from .models import StlFile

class StlForm(forms.ModelForm):
    class Meta:
        model = StlFile
        fields = [
            'uploaded_file'
        ]

After POST request numpy stl reads saved stl file from the model in views.py.

views.py

import os
from django.shortcuts import render
import numpy as np
from stl import mesh
from .forms import StlForm
from .models import StlFile
# Create your views here.
def model_form_upload(request):
    if request.method == 'POST':
        form = StlForm(request.POST, request.FILES)
        if form.is_valid():
            stl_file = form.save(commit=False) # Read file but Don't save the file yet
            stl_file.uploaded_file = request.FILES['uploaded_file'] # Read file instance in model parameter
            stl_file.save()
            # Extract mechanical properties from STL
            stl_path = stl_file.uploaded_file.url
            stl_mesh = mesh.Mesh.from_file(stl_path) # Read saved file from the url
            volume, cog, inertia = stl_mesh.get_mass_properties()            
            return render(request, 'stl_upload/success.html')
    else:
        form = StlForm()
    return render(request, 'stl_upload/upload.html', {'form': form})

Error

Traceback Error

Environment:

Request Method: POST
Request URL: http://127.0.0.1:8000/stl_upload/

Django Version: 3.1.1
Python Version: 3.6.6
Installed Applications:
['stl_upload',
 'maths',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\olahurikar\Desktop\Misllenious\MOD\Dango_Experiments\django_venv_experiment\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\olahurikar\Desktop\Misllenious\MOD\Dango_Experiments\django_venv_experiment\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\olahurikar\Desktop\Misllenious\MOD\Dango_Experiments\experiment\stl_upload\views.py", line 18, in model_form_upload
    stl_mesh = mesh.Mesh.from_file(stl_path) # Read saved file from the url
  File "C:\Users\olahurikar\Desktop\Misllenious\MOD\Dango_Experiments\django_venv_experiment\lib\site-packages\stl\stl.py", line 328, in from_file
    with open(filename, 'rb') as fh:

Exception Type: FileNotFoundError at /stl_upload/
Exception Value: [Errno 2] No such file or directory: 'C:/media/panther_wH1qGon.stl'

Upvotes: 2

Views: 1073

Answers (1)

Biplove Lamichhane
Biplove Lamichhane

Reputation: 4095

As, your media file could not be accessible. So we will use MEDIA_ROOT defined in your settings file. So:

import os
from django.shortcuts import render
import numpy as np
from stl import mesh
from .forms import StlForm
from .models import StlFile
from pacakge_name.settings import MEDIA_ROOT  # package_name , the folder inside which your settings.py is
# Create your views here.
def model_form_upload(request):
    if request.method == 'POST':
        form = StlForm(request.POST, request.FILES)
        if form.is_valid():
            stl_file = form.save(commit=False) # Read file but Don't save the file yet
            stl_file.uploaded_file = request.FILES['uploaded_file'] # Read file instance in model parameter
            stl_file.save()
            # Extract mechanical properties from STL
            stl_path = f"{MEDIA_ROOT}/{Stl_file.uploaded_file.name}"
            stl_mesh = mesh.Mesh.from_file(stl_path) # Read saved file from the url
            volume, cog, inertia = stl_mesh.get_mass_properties()            
            return render(request, 'stl_upload/success.html')
    else:
        form = StlForm()
    return render(request, 'stl_upload/upload.html', {'form': form})

Upvotes: 1

Related Questions