Django

[Django] 이미지 업로드 구현

김디니 2022. 10. 18. 20:34

ImageField

  • 이미지 업로드에 필요한 모델 필드이다.
  • FileField를 상속받는 서브 클래스이다.
    • 업로드 된 객체가 유효한 이미지인지 자동으로 검사를 해준다!
  • ImageField 인스턴스는 최대 길이가 100자인 문자열로 DB에 생성된다.
    • max_length 인자를 사용하여 최대 길이를 변경 할 수 있다.
  • Pillow 라이브러리를 설치해야 이용 가능하다

 

URL 설정

1. settings.py에 Media 설정

# setting.py

# Media files (user uploaded filed)

MEDIA_ROOT = BASE_DIR / 'images'
MEDIA_URL = '/media/

업로드한 파일들을 보관할 디렉토리 절대 경로를 설정해준다.

성능을 위해 업로드한 파일은 데이터베이스에 저장하지 않는다!

실제 데이터베이스에 저장되는 것은 파일의 경로이다.

MEDIA_URL은 MEDIA_ROOT에서 제공되는 미디어를 처리하는 URL이다

업로드된 파일의 주소(URL)를 만들어준다.

 

2. urls.py에서 파일 경로 설정

# urls.py

from django.conf import settings
from django.conf.urls.static import static  


urlpatterns = [
    path('admin/', admin.site.urls),
    path('articles/', include('articles.urls')),
    path('accounts/', include('accounts.urls')),
]
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

위 설명과 같이 업로드된 파일의 url(경로)를 데이터베이스에 저장해주기 위해 urls.py에 설정해준다.

 

3. models.py 설정

# articles/models.py


class Article(models.Model):
    ...
    image = models.ImageField(upload_to='images/', blank=True)

upload_to=‘images/’는 이미지가 저장되는 경로를 지정한다.

blank=True는 이미지 필드에 빈값이 허용되도록 설정하는 것이다.

 

3-1. makemigrations, migrate

데이터베이스에 바뀐 모델 값을 다시 알려준다.

 

4. .html에 enctype 속성 지정

<!-- articles/create.html -->

<form action="" method="POST" enctype="multipart/form-data">
  {% csrf_token %}
  {% bootstrap_form article_form %}
  {% bootstrap_button button_type="submit" content="OK" %}
</form>
{% endblock %}

enctype="multipart/form-data" 인코딩 속성을 설정해준다.

multipart/form-data : 전송되는 데이터의 형식을 지정한다.

<!-- articles/detail.html-->

...
<img src="{{ article.image.url }}" alt="{{ article.image }}">
...
{% endblock %}

업로드한 이미지를 detail 페이지에서 보여줄 수 있도록 한다.

 

5. views.py 설정

def create(request):
    if request.method == 'POST'
        article_form = ArticleForm(request.POST, request.FILES)
    ...

업로드한 파일은request.FILES 객체로 전달된다.

 

업로드한 이미지 읽기

1. detail.html에서 이미지 불러오기

<!-- articles/detail.html -->

...
<img src="{{ article.image.url }}" alt="{{ article.image }}">

...

article.image.url : 업로드 파일의 경로를 뜻한다.

article.image: 업로드 파일 이름을 명시한다.

 

업로드한 이미지 수정하기

이미지를 수정하기 위해서는 새로운 사진으로 덮어 씌우는 방식을 사용한다.

 

views.py 에서 update 함수 정의

# articles/views.py
def update(request.pk):
    ...
    form ArticleForm(request.POST, request.FILES, instance=article)
    ...

 

이미지 Resizing하기

django-imagekit 라이브러리를 활용한다.

 

1. settings.py에서 INSTALLED_APP 설정

INSTALLED_APP = [
    ...
    'imagekit',
    ...
]

 

2. models.py 설정

 
from imagekit.models import ProcessedImageField
from imagekit.processors import ResizeToFill, Thumbnail

image = ProcessedImageField(upload_to='images/', blank=True,
                                processors=[ResizeToFill(400, 300)],
                                format='JPEG',
                                options={'quality': 80})

thumbnail = ProcessedImageField(upload_to='images/', blank=True,
                                processors=[Thumbnail(200, 300)],
                                format='JPEG',
                                options={'quality': 80})​

`ProcessedImageField`의 parameter로 작성된 값들은 변경이 되더라도 다시 makemigrations를 해줄 필요없이
즉시 반영 된다.

'Django' 카테고리의 다른 글

[Django] ForeignKey - User 정보 가져오기  (0) 2022.10.19
[Django] 댓글 기능 구현  (0) 2022.10.18
[Django] 로그인 & 로그아웃  (0) 2022.10.12
[이론] Django 개발 환경 설정 가이드  (0) 2022.09.21
[이론] 서버 기초  (0) 2022.09.21