Django 게시물에 사진 첨부하기

찬민·2024년 9월 10일
0

TIL

목록 보기
52/62

게시물 추가 api를 만드는 도중에 이미지도 필수로 추가를 해야 되는 것을 깨닫았다. 나중에 까먹을 것을 대비해 노트를 하기로 했다.

1. 모델에 이미지 필드 추가

게시물에 이미지를 첨부하려면 먼저 모델에 ImageField를 추가해야 한다. ImageField는 이미지 파일을 저장하고 업로드할 수 있는 필드다.

from django.db import models
from accounts.models import User 

class Product(models.Model):
    title = models.CharField(max_length=50)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='images/')  # 이미지 필드 추가
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return f"{self.id}: {self.title}"

설명:

  • ImageField는 이미지 파일을 저장하기 위한 필드다. upload_to='images/'를 통해 파일이 저장될 경로를 설정할 수 있다.
  • author 필드는 ForeignKey로 작성자를 연결해준다.

2. 이미지 포함을 위한 Serializer 설정

이미지를 포함하는 데이터를 처리하기 위해 ModelSerializer를 설정한다. 이미지를 함께 처리하기 위해서는 해당 필드를 ProductSerializer에 포함해야 한다.

from rest_framework import serializers
from .models import Product

class ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'  # 모든 필드를 직렬화, 이미지 필드도 포함

설명:

  • ProductSerializerProduct 모델의 모든 필드를 포함하도록 설정했다. 이때, 이미지 필드도 직렬화된다.

3. 이미지 업로드를 처리하는 뷰

이미지를 포함한 데이터를 처리하려면 POST 요청을 통해 파일을 함께 전송해야 한다. 뷰에서 이를 처리하는 방법은 다음과 같다.

from rest_framework.views import APIView
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response   
from .models import Product
from .serializers import ProductSerializer

class ProductListView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        title = request.data.get("title")
        content = request.data.get("content")
        image = request.FILES.get("image")  # 이미지 파일 처리
        
        product = Product.objects.create(
            title=title, 
            content=content, 
            image=image, 
            author=request.user
        )
    
        serializer = ProductSerializer(product)
        return Response(serializer.data, status=201)

설명:

  • request.FILES.get("image"): 이미지 파일은 FILES 객체에서 가져온다.
  • Product.objects.create를 통해 데이터를 데이터베이스에 저장하면서 이미지를 함께 저장한다.

4. 이미지 표시하기

이미지를 게시물에 업로드한 후에는 템플릿에서 이미지를 출력할 수 있다. 업로드된 이미지의 URL을 사용해 이미지를 표시한다.

{% if product.image %}
    <img src="{{ product.image.url }}" alt="{{ product.title }}">
{% endif %}

설명:

  • product.image.url: 이미지가 저장된 경로를 불러와서 화면에 표시한다.

5. 미디어 파일 설정

이미지 파일이 제대로 저장되고 서비스되기 위해서는 settings.py에서 미디어 파일 설정이 필요하다.

MEDIA_URL = '/media/'
MEDIA_ROOT = BASE_DIR / 'media'

또한 urls.py 파일에서 미디어 파일을 제공할 수 있도록 설정해야 한다.

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

urlpatterns = [
    # 다른 URL 패턴들
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

설명:

  • MEDIA_URL은 이미지 파일에 접근할 URL 경로를 설정한다.
  • MEDIA_ROOT는 실제 파일이 저장될 경로를 지정한다.

0개의 댓글