<요약> 

 

  1. Static과 media는 어떤차이가 있는가?
  2. media 설정하기 
  • settings.py에서 media 설정
  • url설정 
  •  외부에서 받을 데이터 모델 class 만들어주기 
  • admin.py에서 만든 class 등록
  • 모든 class의 내용을 보여주라는 view 작성
  • html에  화면 띄우기 (templates 작성 ) 

 

 

 

< 배운것> 

 

1. static 과 media 

2. django에서 외부와 통신하는 방법은 URL 

 

 

 


 

 

이전 글에  Django에서 처리하는 데이터의 종류는 두가지가 있다고 했습니다. ( 정적파일,동적파일)

그리고 이중 정적파일은 준비해둔 파일을 보여주는 static파일과 외부에서 사용자가 업로드하는 media파일로 나눌 수 있습니다. 

이번에는 media파일을 다루어 보겠습니다. 

 

 

 

media 파일이란  
프로젝트에 업로드 되는파일을 말합니다. 

 

 

media파일을 다루기 위해서 해야할 것이 있습니다. 

1. 업로드될 파일을 저장할 디렉토리경로 지정해주기

2. url 지정 ( 바로 밑에서 설명.) 

 

Static vs Media은 어떤 차이가 있는가? 

Static

- 요청하면 준비해둔 파일
해당 파일이 어떤 파일인지 알아 내기 위하여 외부와 통신 X


Media 

-프로젝트 외부와의 통신을 통해서 얻게되는 파일. 
해당 파일이 어떤 파일인지 알아 내기 위하여 외부와 통신 O

 

 

< 장고는 외부와 통신할 때 URL을 통해서 통신한다. >

 

Django와 외부의 통신망 url이기 때문에 Media파일을 사용하기 위해 디렉토리 경로뿐만 아니라 url도 설정해줘야 한다. 

 

 

<정적파일을 다룰 때 Settings.py에서 설정해 줘야 하는 것들 >

 

정적파일의 종류인 static과 media는 다음과 같은 차이를 보입니다.

Static Meida
Static 파일이 어디있고
STATICFILES_DIRS = [...]
Media 파일이 어느 url을 타고
MEDIA_URL
어디로 모을지
STATIC_ROOT
어디로 모을 것인지
MEDIA_ROOT

 

 

 

 

이제 media를 설정해보자. 

 

 


media설정 하는 과정은 다음과 같다. 

 

  1. settings.py에서 media 설정
  2. url설정 
  3.  외부에서 받을 데이터 모델 class 만들어주기 
  4. admin.py에서 만든 class 등록
  5. 모든 class의 내용을 보여주라는 view 작성
  6. html에  화면 띄우기 

 

 

1. settings.py에서 media 설정

 

django 프로젝트 폴더의 settings.py에서 맨 밑에 다음 코드를 추가한다. 

 

MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

MEDIA_URL = '/media/'

 

 

2. url.py에서 path 설정

 

static 관련 내용을 import하고 맨 마지막에 static 관련한 한줄을 추가해줍니다. 그냥 이렇게 해야 올린 이미지를 읽어올수 있구나 생각하면 됩니다.

 

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

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', blogapp.views.home, name="home"),
    path('blog/<int:blog_id>', blogapp.views.detail, name="detail"),
    path('blog/new', blogapp.views.new, name="new"),
    path('blog/create', blogapp.views.create, name="create"),
    path('portfolio', portfolio.views.portfolio, name="portfolio"),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

 

3. 외부에서 받을 데이터 모델 class 만들어주기 

 

 

외부에서 업로드 요청할 파일의 Class모델을 만들어 줍니다.

모델에서 받아올 정보는 이미지 파일과 텍스트 파일입니다. 모델을 만들어 봅시다.

 

class Portfolio(models.Model):
    title = models.CharField(max_length=255)
    image = models.ImageField(upload_to='images/')
    description = models.CharField(max_length=500)

    def __str__(self):
        return self.title

image를 살펴보면 upload_to='images/'라는 내용이 있는데 이부분이 업로드된 이미지들을 images 폴더안에 넣으라는 의미입니다

 

<Tip>

DB 안에 데이터들을 어떻게 구성할지 만드는 설계도 같은 겁니다. 여기에 어떤 방식으로 적어야하는지는 django documentation에 잘 나와있습니다. 원하는 모델 구성이 있을때 찾아보며 작성하면 됩니다.

 

https://docs.djangoproject.com/ko/2.1/topics/db/models/

 

모델 | Django 문서 | Django

Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate

docs.djangoproject.com

이미지 파일을 다루기 위해서는 pillow를 설치 해야 합니다. 

 

pip install Pillow

 

 

모델을 만들었으니 migrate 해야합니다. 

python manage.py makemigrations
python manage.py migrate

 

 

 

4. admin.py에서 만든 class 등록

 

model을 만들었으니 admin사이트에서 보여주기 위해서 admin.py 에서 class를 등록해줍니다.

portfolio앱 안에 있는admin.py에서 

from .models import Portfolio

admin.site.register(Portfolio)

 

 

5. 모든 class의 내용을 보여주라는 view 작성

view를 수정해봅시다. 기존 portfoilio.html만 보여주었던 화면과 달리 model을 연결해 데이터를 받아야합니다.

 

from .models import Portfolio

def portfolio(request):
    portfolios = Portfolio.objects

    return render(request, "portfolio.html", {
        "portfolios": portfolios,
    })

 

6. html에  화면 띄우기 

마지막으로 portfolio.html에 이미지 파일을 띄어 봅시다. 

다음과 같이 portfolio.html을 수정해줍니다. 

 

{% for portfolio in portfolios.all %}
<div class="col-lg-6 portfolio-item">
    <div class="card h-100">
        <a href="#"><img class="card-img-top" src="{{ portfolio.image.url }}" alt=""></a>
        <div class="card-body">
            <h4 class="card-title">
                <a href="#"> {{ portfolio.title }} </a>
            </h4>
            <p class="card-text"> {{ portfolio.description }} </p>
        </div>
    </div>
</div>
{% endfor %}

 

이제 실행시키고 admin사이트에 접속해 이미지를 업로드해봅시다. 

 

이렇게 나오면 성공

 

+ Recent posts