완숙의 블로그

[Django] Week 7.5 Thumbnail 만들기 본문

Programing Language/Web_Django

[Django] Week 7.5 Thumbnail 만들기

완숙 2019. 3. 12. 14:27

기능을 사용하는 것만 배워보자!

 

그런데, 왜 이걸 굳이 배워야 할까??

static이나 media로 올려주면 되지 않을까??

 

섬네일 기능을 사용하면 좋은 점

  1. 썸네일 파일 지정이 용이하다.
  2. 파일의 용량관리가 용이하다.
  3. 파일 분류에 효율적이다. (섬네일은 섬네일 끼리)

 

사전작업

  1. models.py 에 클래스를 만들어주자.

    # goologin.models.py
    
    from django.db import models
    
    class Blog(models.Model):
        text = models.TextField()
        image = models.ImageField(upload_to = "blogimg")
    

     

  2. 장고한테 알려줘야 하니, migrate해주자.

    $ python manage.py makemigrates
    $ python manage.py migrate
    

     

  3. media 파일을 사용할 것이다.

    기억이 안나면, Media file 여기서 공부하도록 하자!

    settings.py

    # settings.py
    
    STATIC_URL = '/static/'
    MEDIA_URL = '/media/'
    MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
    

     

  4. urls.py 로 가서,

    # urls.py
    
    
    from django.conf import settings
    from django.conf.urls.static import static
    
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('', goologin.views.home, name = "home"),
        path('accounts/', include('allauth.urls')),
    ] + static(settings.MEDIA_URL, document_root = settings.MEDIA_ROOT)
    

    위의 두녀석을 가져오고, 추가적 함수를 url에 더해주자.

    가져와야 사용할 수 있다.

     

  5. admin.py 에서 이녀석을 관리해줄거니까, 등록해주고,

    # admin.py
    
    from django.contrib import admin
    from .models import Blog
    
    admin.site.register(Blog)
    

     

  6. views.py 안에다가는,

    # views.py
    from django.shortcuts import render
    
    def home(request):
        blog = Blog.objects
        return render(request, 'home.html')
    # Create your views here.
    

    모델 객체를 받아준다.

     

  7. home.html 에는, 마지막에 블로그 객체를 표현해야하니,

    <!-- home.html -->
    
    {% for blog in blog.all %}
    
    <img src="{{blog.image.url}}" width = 500>
    <br>
    
    {{blog.text}}
    {% endfor %}
    

     

 

실습

  1. 먼저, pip 패키지를 받아주자.

    엄청 여러개가 있는데, 그중에서

    $ pip install pillow django-imagekit
    

    를 다운받자.

     

  2. 새로운 앱이 설치가 되었으니,

    앱을 settings.py 에 추가해주자.

    # INSTALLED_APPS = [
        # allauth			
        'allauth',
        'allauth.account',
        'allauth.socialaccount',
        
        # provider 	구글, 페이스북, 카톡, 깃헙
        'allauth.socialaccount.providers.google',
    
        # imagekit
        'imagekit'
    ]
    

     

  3. models.py 에 가서 임포트해오자.

    # models.py
    from django.db import models
    from imagekit.models import ImageSpecField ### 이것
    from imagekit.processors import ResizeToFill ### 이것
    
    class Blog(models.Model):
        text = models.TextField()
        image = models.ImageField(upload_to = "blogimg")
    # Create your models here.
    
    

    첫번째는, 이 함수를 사용해서 썸네일을 만드는 것

    두번째는, 이 걸 사용해서 크기조절을 쉽게 할 수 있다.

     

  4. 이제 섬네일에 해당하는 변수를 만들자.

    # models.py
    from django.db import models
    from imagekit.models import ImageSpecField
    from imagekit.processors import ResizeToFill
    
    class Blog(models.Model):
        text = models.TextField()
        image = models.ImageField(upload_to = "blogimg")
        image_thumbnail = ImageSpecField(source = 'image', processors = [ResizeToFill(120, 60)])
    # Create your models here.
    
    

    image_thumbnail 이라는 변수에는 ImageSpecField 라는 함수를 통해 나온 결과값을 넣는데,

    어떤 이미지 소스를 지정하겠냐, image 라는 녀석!

    그리고 어떻게 처리할거냐? ResizeToFill(120, 60) 120 * 60 크기로!

     

  5. 이제 이녀석을 home.html 에서 띄워주도록만 만들어주면 된다.

    <!-- home.html -->
    {% for blog in blog.all %}
    
    <img src="{{blog.image.url}}" width = 500>
    <br>
    
    {{blog.text}}
    <br><br>
    
    <img src = "{{blog.image_thumbnail.url}}"> ### 이렇게 써주자!
    {% endfor %}
    

    인자로 alt = "대체할 파일 경로" 써주면 좋다.

  6. 서버돌리고 /admin 으로 들어가자.

    가서 Blog 객체를 만들어주자.

    스크린샷 2019-03-11 오후 4 12 15

     

  7. 그러면,

    스크린샷 2019-03-11 오후 4 14 29

     

  8. 사이즈 조절하면 잘 돌아간당.

     

     

  9. 이제 다른 ImageSpecField 의 인자소개를 하고 끝내자.

    # models.py
    
    image_thumbnail = ImageSpecField(source = 'image', processors = [ResizeToFill(120, 60)], format = 'JPEG', options = {'quality':60})
    

    포맷은 파일의 형식을 정해주는 것이고,

    옵션은 파일의 퀄리티를 정해줄 수 있다.

     

    디테일한 인자는 구글링을 해보자!!

 

 

Comments