Reputation: 29
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})
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
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