django 010 | Media
Media 실습
- setting.py 설정 (static, media 모두 만지기 전에 settings 다뤄주기)
MEDIA_ROOT = '/media/'
- media의 url을 표시해둔다
MEDIA_URL = os.path.join(BASE_DIR, 'media') - 이용자가 업로드한 파일을 모으는 곳
=> 아래 두개를 setting.py에 추가해준다
STATICFILES_DIRS=[os.path.join(BASE_DIR, 'blog', 'static')]
#현재 static 파일들이 어디에 있는지
STATIC_ROOT= os.path.join(BASE_DIR, 'static')
#static 파일을 어디에 모을건지
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
#media의 url을 표시해둔다
MEDIA_URL = '/media/'
# 이용자가 업로드한 파일을 모으는 곳
- URL 설정해주기
(1) URL에 아래의 아이들 추가
from django.conf import settings
from django.conf.urls.static import static
(2) url patterns=[]에 static 더해주기
urlpatterns = [
path('admin/', admin.site.urls),
path('',home, name="home"),
path('blog/', include('blog.urls'))
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
=> + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
- 사용자가 사진을 올리고 다운받을 수 있도록 model 수정
- model에 추가 : image=models.ImageField(upload_to="blog/")
=> upload_to : 업로드할 파일을 지정하는 것, setting.py에 MEDIA_URL로 지정해둔 media 폴더 안에 blog 폴더를 만들어서 관리하겠다는 설정
=> 이때 이미지가 존재하지 않는 blank의 경우도 존재 따라서 blank='True'설정을 해줘야 함
: image=models.ImageField(upload_to="blog/", blank='True', null='True')
- 이미지 필드를 사용하기 위해 pillow 깔기
pip install pillow
-
모델 변경했으니 이주 시켜주기
(1) python manage.py makemigrations
(2) python manage.py migrate -
그런데 이렇게 해주면
갑자기 이미지 칼럼이 추가돼서 기존 데이터가 놀란다~
그리고 오류 발생 => OperationalError at /
no such column: blog_blog.image
따라서 지금 작업중인 파일 => 프로젝트 => 앱 => migrations 들어가서 0001~,0002로 시작되는 친구들 삭제하고 migration내에 pychae라는 친구 들어가서 init 빼고 다 삭제해주면 됨
그 다음에 프로젝트 안의 db.sqlite3 삭제
그 다음에 makemigrations 해주고 migrate 하고 서버 돌리면 이상 없이 나옴
이후 sqlite 지운 거 때문에 superuser 사라져서 다시 createsuperuser하고 django/admin 페이지 들어가서 블로그 모델 확인해보면 사진 파일 올리는 함이 데이터베이스에 잘 반영됐음을 알 수 있음
- new.html 파일에도 반영해주기
사진 : <input type="file" name="image">
추가
- new.html에 제출을 누를 때 파일도 같이 넘겨줘야 하므로 enctype 지정해준다
<form action ="{% url 'create' %}" method="post" enctype="multipart/form-data">
- views의 create 함수도 수정
new_blog.image=request.FILES['image']
html로부터 image라는 name의 파일형태를 new_blog.image로 받아준다
- detail.html도 글을 올리면 여기서 보이도록 해줘야 함
<p><img src="{{ blog.image.url }}" alt=""></p>
=> 이미지 추가
- 우리는 실제 이미지를 가져오는게 아니라 url을 가져와서 전달해주는것 따라서 위의 url형태로 전달해주면 된다 *
- 근데 이미지가 없을 때는 detail.html 페이지에서 보이면 안되겠지
그래서 파이썬 if 문법으로 예외사항 처리해주면 됨
{% if blog.image %}
<p><img src="{{ blog.image.url }}" alt=""></p>
{% endif %}
결과창 :
Author And Source
이 문제에 관하여(django 010 | Media), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@myway00/django-010-Media저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)