본문 바로가기

IT/django(장고)

[django]장고 개발_8 - 이미지 저장,이미지 삭제

 

이미지를 저장 하기해서는 먼저 가상 화경에서

 

pip install Pillow를 설치해주셔야 돼요.

 

MEDIA_URL = '/uploads/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')

 

그리고 프로젝트 web/settings.py에서 파일이 저장되는 경로를 입력해주세요.

 

class Post(models.Model):    
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=200)
    text = models.TextField()
    created_date = models.DateTimeField(
            default=timezone.now)
    published_date = models.DateTimeField(
            blank=True, null=True)
    upload_file = models.ImageField(    #유효성 검사를 위해서 ImageField를 사용
        blank=True,#해당 속성이 비어도 되는지 유무
        null=True,#null이 들어가도 되는지 유무
        upload_to="image"#경로 설정 (입력 안하면 uploads에 바로 올라가짐)
        )

 

app/models.py 에서 Post클래스에서 upload_file을 추가해주세요.

 

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = ['title', 'text','upload_file']

 

app/forms.py에서 fiedls에 upload_file을 추가해주고,

 

def post_new(request):
    if request.method == "POST":
        form = PostForm(request.POST)
        if form.is_valid():
            post = form.save(commit=False)
            #commit=False가 있는 이유는 바로 저장안함
            post.author = request.user
            post.published_date = timezone.now()
            if request.POST.get('upload_file',True):
                post.upload_file = request.FILES['upload_file']
            post.save()
            return redirect('post_detail', pk=post.pk)

 

app/views.py에서 post_new에 코드를 추가해주세요.

 

<form method="POST" enctype="multipart/form-data" >

 

post_edit.html form태그에 enctype="multipart/form-data"를 추가해주세요.

 

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('',include('app.urls')),
    path('accounts/',include('accounts.urls')),    
]

urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

 

프로젝트/urls.py에 코드 추가

장고는 개발서버에 서빙을 지원을 안 해서 직접 서빙을 지원해주지 않아 직접 서빙 rule을 추가해야 돼요.

MEDIA_URL에 대한 요청이 오면 MEDIA_ROOT에서 찾고, settings.DEBUG = False 일 때는 static 함수에서 빈 리스트를 리턴해줘요.

 

<img src="{{ post.upload_file.url }}" >

 

post_detail.html에서 코드를 입력하면 이미지를 확인할 수 있고, url 대신 path로 경로도 알 수 있어요.

 

def delete(self, *args, **kargs):
        os.remove(os.path.join(settings.MEDIA_ROOT, self.upload_file.name))
        super(Post, self).delete(*args, **kargs)

 

사진을 삭제하기 위해서 models.py에 delete 오버 라이딩을 해주면 사진을 삭제할 수 있어요.