DJANGO FILE HANDLING NOTES
1. Uploading Files (Views)
from [Link] import FileSystemStorage
def upload_file(request):
if [Link] == 'POST' and [Link]['myfile']:
myfile = [Link]['myfile']
fs = FileSystemStorage()
filename = [Link]([Link], myfile)
file_url = [Link](filename)
return render(request, '[Link]', {'file_url': file_url})
return render(request, '[Link]')
2. File Upload Form (Template)
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile">
<button type="submit">Upload</button>
</form>
3. File Storage Location
- By default, files are stored in MEDIA_ROOT.
In [Link]:
MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'
In project [Link]:
from [Link] import settings
from [Link] import static
urlpatterns = [
# your urls here
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
4. Model with FileField
from [Link] import models
class Document([Link]):
upload = [Link](upload_to='uploads/')
5. Handling Files from Model (View)
def show_files(request):
documents = [Link]()
return render(request, '[Link]', {'documents': documents})
6. Displaying Files in Template
{% for doc in documents %}
<a href="{{ [Link] }}">{{ [Link] }}</a><br>
{% endfor %}
7. Deleting Files (Manual)
import os
def delete_file(request, file_id):
doc = [Link](id=file_id)
if [Link]([Link]):
[Link]([Link])
[Link]()
return redirect('show_files')
8. Upload Multiple Files
Use form input with multiple attribute:
<input type="file" name="files" multiple>
Loop over [Link]('files') in views.
9. Validating File Types
from [Link] import ValidationError
def validate_file_extension(value):
if not [Link]('.pdf'):
raise ValidationError('Only PDF files are allowed.')
Use in model:
upload = [Link](upload_to='uploads/', validators=[validate_file_extension])