Django - models.imageField, FileFieild url 응용
Web/Django

Django - models.imageField, FileFieild url 응용

뉴비뉴 2019. 8. 9.

Django 로 아주아주 간단한 프로젝트로 여태까지 읽은 책들을 정리하는 사이트를 만들어보고 있던 도중 {% for i in book_list %} 로 book_list의 author,title,publisher들을 출력하고 있었다.

 

이미지를 추가하려고 했는데 생각해보니 for 문 안에 img src="고정URL" 가 있어서 똑같은 사진이 출력되는 것이였다. 

위 방법을 해결하기 위해서는 static과 models.ImageField 를 생성해주면 된다.

먼저 settings.py 로 이동하여 static을 지정해주도록 하자.

settings.py

STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR,'static')] # 개발단계
# STATIC_ROOT = os.path.join(BASE_DIR,'static') # 배포단계

STATIC_ROOT는 그럼 언제 사용하는가?

개발 과정에선, 정확히는 settings.py의 DEBUG가 True로 설정되어 있으면 STATIC_ROOT 설정은 작용하지 않으며, STATIC_ROOT는 실 서비스 환경을 위한 설정 항목입니다. 그래서 개발 과정에선 STATIC_ROOT에 지정한 경로가 실제로 존재하지 않거나 아예 STATIC_ROOT 설정 항목 자체가 없어도 문제없이 동작합니다.

models.py

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=30)
    author = models.CharField(max_length=30)
    publisher = models.CharField(max_length=100)
    bookimages = models.ImageField(upload_to='static/bookimages',default='None.jpg')
# static/bookimages 에 이미지 파일이 올라가게 된다.

    def __str__(self):
        return self.title

book_list.html

   {% for i in book_list %}
        <div class="card" style="width: 18rem;">
            <img src="{{ i.bookimages.url }}" class="card-img-top" alt="{{ i.title }}">
                <div class="card-body">
                    <h5 class="card-title">{{ i.title }}</h5>
                    <p class="card-text">{{ i.author }}</p>
                    <p class="card-text">{{ i.publisher }}</p>
                    <a href="#" class="btn btn-primary">Go somewhere</a>
        </div>
    </div>
    {% endfor %}

<img src="{{ i.bookimages.url }}" . . .> 이런식으로 사용하면 for문이 돌면서 bookimages 필드와 url에 맞는 것을 가져와서 사용한다. FileField 에서도 사용할 수 있다고 하니 기억해뒀다가 나중에 사용하면 좋을 것 같다.

 

댓글

💲 추천 글