- 사용자가 웹에서 업로드하는 정적 파일
- 파일 업로드에 사용하는 모델 필드
- 2개의 선택 인자를 가지고 있다.
- upload_to
- storage
# settings.py
MEDIA_ROOT = BASE_DIR / 'media'
# 유저가 업로드하면 자동으로 폴더가 생성 됨
/
로 끝나야함# settings.py
MEDIA_URL = '/media/'
# app/urls.py
from django.conf import settings
from django.conf.urls.static import static
urlpatterns=[
] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
# 업로드 된 URL, 실제 파일의 위치
# 사용자가 업로드 한 파일이 우리 프로젝트에 업로드 되지만, 실제로 사용자에게 제공하기 위해서는 업로드 된 파일의 URL이 필요
# models.py
class MyModel(models.Model):
# MEDIA_ROOT/uploads/ 경로로 파일 업로드
upload = models.FileField(upload_to = 'uploads/')
# or
# MEDIA_ROOT/uploads/2021/01/01 경로로 파일 업로드
upload = models.FileField(upload_to = 'uploads/%Y/%m/%d/')
위의 MEDIA_ROOT, MEDIA_URL이 이미지 업로드의 준비 단계.
DB에 저장되는 것은 파일의 경로
# models.py
class MyModel(models.Model):
image = models.ImageField(blank= True, upload_to = 'images/'
# app_name/create.html
<form action='{% url 'articles:create' %}' method="POST" enctype='multipart/form-data'>
#. views.py
def create(request):
if request.method == 'POST':
form = ArticleForm(request.POST, request.FILES)
if form.is_valid():
article = form.save()
rerdirect('articles/detail.html', article.pk)
반드시 2개의 인자(instance, filename)을 사용 함
# models.py
def articles_image_path(instance, filename):
# MEDEIA_ROOT/user_<pk>/ 경로로 <filename> 이름으로 업로드
return f'user_{instance.pk}/{filename}'
class Article(models.Model):
image = models.ImageField(upload_to = articles_image_path)
<img src="{{ article.image.url }}" alt="{{ article.image }}">
# 업로드 파일의 경로 #업로드 파일의 파일 이름
# views.py
def update(request, pk):
article = get_object_or_404(Article, pk=pk)
if request.method == "POST":
form = ArticleForm(request.POST, request.FILES, instance=article) # 마지막 위치에 넣을꺼면 files=request.FILES라고 해야 함
if form.is_valid():
form.save()
return redirect('articles:detail', article.pk)
위의 ArticleForm뒤의 매개변수 순서가 저렇게 된 이유는 아래 링크 참고
https://github.com/django/django/blob/main/django/forms/models.py#L286 위치인자, 키워드 인자 규칙 때문에
좋아요!