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 |