DRF 4-4 Static 파일 (image)

Grace Goh·2022년 11월 9일
0

Django Rest Framework

목록 보기
15/36

How to manage static files (e.g. images, JavaScript, CSS)
https://docs.djangoproject.com/en/4.1/howto/static-files/
구글링 'django static'

Static 파일

django에서는 이미지, JavaScript, CSS 등의 추가적인 파일을 static이라 한다. 사용자의 요청에 따라 내용이 바뀌지 않는다.

STATIC_URL = 'static/(원하는파일이름)'

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


urlpatterns = [
    # ... the rest of your URLconf goes here ...
] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)

Media 파일과 Static 파일의 차이

  • media : 사용자가 웹에 업로드한 파일
  • static : 개발 단계에서 업로드해서 보여주는 파일. default image

django의 Fields

https://docs.djangoproject.com/en/4.1/ref/models/fields/

ImageField

  • FileField의 모든 속성attributes과 methods를 상속받는다.
  • Validates that the uploaded object is a valid image.
  • heightwidth 속성attributes이 있다. (Image에 특화)
  • Pillow library가 필수 (Python에서 이미지를 다룰 때 사용)
    pip install

Using FileField or ImageField in model

  1. In your settings file, you’ll need to define MEDIA_ROOT as the full path to a directory where you’d like Django to store uploaded files. Define MEDIA_URL as the base public URL of that directory. Make sure that this directory is writable by the web server’s user account.

  2. Add the FileField or ImageField to your model, defining the upload_to option to specify a subdirectory of MEDIA_ROOT to use for uploaded files.

  3. All that will be stored in your database is a path to the file (relative to MEDIA_ROOT). You’ll most likely want to use the convenience url attribute provided by Django. For example, if your ImageField is called mug_shot, you can get the absolute path to your image in a template with {{ object.mug_shot.url }}.


# articles/models.py

from django.db import models
from users.models import User  # 추가


class Article(models.Model):  # 상속을 받고
    # 한 user가 여러 article. 1:many. FK
    user = models.ForeignKey(User, on_delete=models.CASCADE)  # 삭제할 때 없애준다
    title = models.CharField(max_length=50)  # 제목 최대 50자
    content = models.TextField()  # 많이 쓸 수 있게
    image = models.ImageField()
    created_at = models.DateTimeField(auto_now_add=True)  # 자동으로 생성되었는지 여부
    updated_at = models.DateTimeField(auto_now=True)

    # admin 페이지에서 편하게 볼 수 있게
    def __str__(self):
        return str(self.title)  # 보여주는 방식

모델 만들었으니 makemigrations 한다.
migrate 해서 DB에 적용한다.

# settings.py


# Base Directory의 static 폴더
STATIC_ROOT = BASE_DIR / "static"
STATIC_URL = 'static/'

MEDIA_ROOT = BASE_DIR / "media"
MEDIA_URL = "/media/"

# urls.py

from django.contrib import admin
from django.urls import path, include
from django.conf import settings  # 이하를 추가
from django.conf.urls.static import static

urlpatterns = [
    path('admin/', admin.site.urls),
    path('users/', include("users.urls")),
    path('articles/', include("articles.urls")),
]

# 이하를 추가
urlpatterns += static(settings.STATIC_URL, document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

개발 단계에서 media 파일을 쓸 준비가 완료되었다.

모델을 만든 후 모델을 테스트하는 첫 번째 방법은 admin 페이지를 만드는 것이다.

# admim.py

from django.contrib import admin
from articles.models import Article


admin.site.register(Article)  # object

admin에 접속하면 글과 함께 사진을 저장할 수 있다.

프로젝트 폴더에 meida 폴더가 만들어진다.

settings.py에서 MEDIA_URL = "/media/"였기 때문에
http://127.0.0.1:8000/media/happy.jpg 에서 업로드한 사진을 볼 수 있다.

media 폴더 한 개로만 관리하면 너무 많은 사진이 들어갈 수 있기 때문에

# models.py

from django.db import models
from users.models import User


class Article(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=50)
    content = models.TextField() 
    # (이미지 없는 글도 가능하도록, 년/월 폴더 생성)
    image = models.ImageField(blank=True, upload_to='%Y/%m/')
    created_at = models.DateTimeField(auto_now_add=True) 
    updated_at = models.DateTimeField(auto_now=True)

    # admin 페이지에서 편하게 볼 수 있게
    def __str__(self):
        return str(self.title)

위와 같이 ImegeField()를 설정하고 나서 (admin을 통해 image를 올리면)
media 폴더 하위에 2022/11 폴더가 생성되고 새 파일이 저장된다.

profile
Español, Inglés, Coreano y Python

0개의 댓글