When uploading an image file with the Django app, I think it's a standard practice to use ImageField to save it in the DB. However, the app I made the other day in practice needs to save the file in a specific folder instead of the DB ** due to integration with other systems **, and it took a while to find out how to do it, so I wrote an article. I will leave it.
This can be achieved using ** forms.ImageField **.
Below is a sample of the minimum configuration.
top page
The screen changes when you select an appropriate image file and send it.
If you look at the base directory of the project, a "media_root" folder is created, and the uploaded file is saved in it.
If you upload a file other than an image, an error message will be displayed.
forms.py
import datetime
from django import forms
from django.core.files.storage import default_storage
class FileUploadSampleForm(forms.Form):
file = forms.ImageField()
def save(self):
"""Method to save file"""
now_date = datetime.datetime.now().strftime('%Y%m%d%H%M%S') #Get to give the current time to the file name
upload_file = self.files['file'] #Get the upload file from the form
file_name = default_storage.save(now_date + "_" + upload_file.name, upload_file) #Save file The return value is the name of the file actually saved
return default_storage.url(file_name)
views.py
from django.shortcuts import render
from django.views.generic import View
from .forms import FileUploadSampleForm
class IndexView(View):
def get(self, request, *args, **kwargs):
"""Method for GET request"""
form = FileUploadSampleForm
return render(request, 'fileUploadSample/index.html', {"form": form})
def post(self, request, *args, **kwargs):
"""Method for POST request"""
form = FileUploadSampleForm(request.POST, request.FILES)
if not form.is_valid():
return render(request, 'fileUploadSample/index.html', {"form": form})
filename_save = form.save()
context = {
'form': form,
'filename_save': filename_save,
}
return render(request, 'fileUploadSample/index.html', context)
index = IndexView.as_view()
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="{% url 'fileUploadSample:index' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
{#forms.Show Image Field#}
{{ form.file }}
<br><br>
{#Show error message#}
{% for field in form %}
{% if form.errors %}
<font color=#CC3300>{{ field.errors }}</font><br>
{% endif %}
{% endfor %}
{#Show saved file name#}
{% if filename_save %}
file name{{ filename_save }}It was saved in.
<br><br>
{% endif %}
<input type="submit" value="Send"/>
</form>
</body>
</html>
urls.py
from django.urls import path
from . import views
app_name = 'fileUploadSample'
urlpatterns = [
path('', views.index, name='index'),
]
Please add the following to settings.py.
settings.py
MEDIA_ROOT = os.path.join(BASE_DIR, 'media_root')
You can also use ** forms.FileField ** to support uploading files other than images (form.is_valid () will eliminate the error even if it is not an image file).
that's all. Thank you for your hard work: cat2:
Recommended Posts