class Post(models.Model):
message = models.TextField()
photo = models.ImageField(blank=True)
is_public = models.BooleanField(default=False, verbose_name='공개여부')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
models.py에 ImageField를 만든다.
makemigrations, migrate 명령을 내리면 DB에 반영이 된다.

admin에 들어가면 이렇게 포토 필드가 생겼다.
미디어 파일이 저장되는 경로를 아래와 같이 설정한다.
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
settings.py에 있는 BASE_DIR 값을 더 자세히 살펴보면
아래 코드로 구성이 된다.
즉 해당 settings.py가 있는 부모 부모의 폴더, 즉 프로젝트의 폴더의 경로라는 의미인 거 같다
BASE_DIR = Path(file).resolve().parent.parent
어쨌든 상위 폴더에서 media라는 경로에 미디어 파일을 저장한다는 소리인 것 같음.
media_url에 따라서 업로드한 이미지 파일 링크를 열어보면
http://127.0.0.1:8000/media/그림4.png <- 이러한 주소가 뜬다.
만약에 이미지 url로 접속했을 때 이미지를 반환받고 싶다면
if settings.DEBUG:
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
위의 코드를 별도로 설정해줘야 한다.
(설정 해주지 않으면 이미지 링크에 접속했을 때 error 발생)
만약 등록한 post를 display를 하고 싶다면,
@admin.register(Post)
class PostAdmin(admin.ModelAdmin):
list_display = ['id', 'photo_tag', 'message', 'created_at', 'is_public', 'updated_at', 'message_length']
list_display_links = ['message']
list_filter = ['created_at']
search_fields = ['message']
def photo_tag(self, post):
if post.photo:
return mark_safe(f'')
return None
위 처럼 코드를 작성해주면 된다.
즉 photo_tag 라는 함수를 만들었는데
이 함수의 의미는
만약 post에 photo가 있다면
아래와 같은 img를 반환하라는 의미
앞의 mark_safe는 보안 기능의 일종..이라고 한다.

그러면 위처럼 포토태그 밑에 이미지가 뜬다.