이미지를 저장 하기해서는 먼저 가상 화경에서
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 오버 라이딩을 해주면 사진을 삭제할 수 있어요.
'IT > django(장고)' 카테고리의 다른 글
[django]템플릿 언어 (0) | 2019.12.16 |
---|---|
[django]장고 개발_9 - 썸네일 , pagination (0) | 2019.12.04 |
[django]장고 개발_7 - 회원수정, 회원삭제, class has no objects member 에러해결 (0) | 2019.11.22 |
[django]장고 개발_6 - 장고 회원가입, 로그인, 로그아웃 (0) | 2019.11.21 |
[django]장고 개발_5 - 리스트, 글쓰기 , 수정 , 삭제 (CRUD) (0) | 2019.11.16 |