http://www.django.co.zw/en/tutorials/setting-django-s-static-and-media-urls/
settings.py
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')STATICFILES_DIRS = (
os.path.join(BASE_DIR, 'static'),
)
➜디렉터리 경로가 하나이더라도 반드시 list나 tuple로 담아야 한다(쉼표 필수!!)
<img src="{{ file.image }}" >
➜ 파일 경로가 문자열로 저장되어서 그냥 문자열 출력
<img src="{{ file.image.url }}" > # 상대경로
<img src="{{ file.image.path }}" > # 절대경로
➜ 둘다 media파일을 참조하므로 이미지 출력가능
<img src="{% '파일.이미지.url' %}>
미디어 파일(사용자가 업로드하는 사진들)을 저장하기 위해선 프로젝트 폴더의 settings.py에서 MEDIA_ROOT 와 MEDIA_URL을 설정해준다
프로젝트 폴더나 이미지 파일을 사용하고자하는 폴더의 urls.py에 url패턴 뒤에 스태틱 메소드로 이미지 경로를 설정해준다
from django.conf import settings
from django.conf.urls.static import static
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
#또는 바로 더해버려도 됨
urlpatterns[(생략)] +static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
이미지 업로드를 위해서는 PILLOW 패키지가 필요하다
➜ pip install pillow
하나의 게시글에 이미지를 하나 업로드하려면 모델에 이미지 필드를 추가해주면 된다.
➜ varchar 칼럼에 저장됨
하나의 게시글에 이미지를 여러개 업로드하려면 클래스를 만들어서 포스트 모델을 참조하도록 외래키 설정을 해준다 1:N 관계( 이미지 클래스에 포린키 모델을 만들어준다)
보통 views.py에서 POST로 넘겨받은 값을 저장할 댄 request.POST를 사용하지만 파일 및 이미지를 받을 때는 request.FILES을 이용해야 한다
❓input 태그의 onchange가 뭔지 모르겠다 ➜ 인풋의 내용이 바뀌면 onchange이하의 함수에 따라 변화가 생김
html의 <form></form>
인라인으로 enctype="multipart/form-data를 넣어주면 여러개의 이미지를 업로드 할 수 있다/설정하지 않으면 파일 이름만 POST
<input type="file" multiple/>
이것도 마찬가지로 다중파일 선택이 가능하다
이미지 파일 여러개 보여주기
➜ 원래는 이미지 클래스가 포스트클래스를 참조하는데 image_set하면 역참조로 포스트클래스가 이미지 클래스를 참조해서 해당포스트의 이미지를 모두 불러온다(all)
{% for photo in post.photo_set.all %}
<img src="{{photo.image.url}}">
{% endfor %}
고래서 하나씩 불러다가 찍어줌
html파일에 이미지 삽입하는 인풋태그 안에 onchange="readURL(this);"
, 스크립트 부분에 아래 코드를 추가하면 올리려는 사진 미리보기를 할 수 있다
<script>
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function(e) {
document.getElementById('preview').src = e.target.result;
};
reader.readAsDataURL(input.files[0]);
} else {
document.getElementById('preview').src = "";
}
}
</script>