django 010 | Media

9200 단어 djangodjango

Media 실습

  1. 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/'
# 이용자가 업로드한 파일을 모으는 곳
  1. 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)

  1. 사용자가 사진을 올리고 다운받을 수 있도록 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')

  1. 이미지 필드를 사용하기 위해 pillow 깔기
pip install pillow
  1. 모델 변경했으니 이주 시켜주기
    (1) python manage.py makemigrations
    (2) python manage.py migrate

  2. 그런데 이렇게 해주면

    갑자기 이미지 칼럼이 추가돼서 기존 데이터가 놀란다~

그리고 오류 발생 => OperationalError at /
no such column: blog_blog.image

따라서 지금 작업중인 파일 => 프로젝트 => 앱 => migrations 들어가서 0001~,0002로 시작되는 친구들 삭제하고 migration내에 pychae라는 친구 들어가서 init 빼고 다 삭제해주면 됨

그 다음에 프로젝트 안의 db.sqlite3 삭제

그 다음에 makemigrations 해주고 migrate 하고 서버 돌리면 이상 없이 나옴

이후 sqlite 지운 거 때문에 superuser 사라져서 다시 createsuperuser하고 django/admin 페이지 들어가서 블로그 모델 확인해보면 사진 파일 올리는 함이 데이터베이스에 잘 반영됐음을 알 수 있음

  1. new.html 파일에도 반영해주기
사진 : <input type="file" name="image"> 

추가

  1. new.html에 제출을 누를 때 파일도 같이 넘겨줘야 하므로 enctype 지정해준다
    <form action ="{% url 'create' %}" method="post" enctype="multipart/form-data">
  1. views의 create 함수도 수정
    new_blog.image=request.FILES['image']

html로부터 image라는 name의 파일형태를 new_blog.image로 받아준다

  1. detail.html도 글을 올리면 여기서 보이도록 해줘야 함
    <p><img src="{{ blog.image.url }}" alt=""></p>

=> 이미지 추가

  • 우리는 실제 이미지를 가져오는게 아니라 url을 가져와서 전달해주는것 따라서 위의 url형태로 전달해주면 된다 *
  1. 근데 이미지가 없을 때는 detail.html 페이지에서 보이면 안되겠지
    그래서 파이썬 if 문법으로 예외사항 처리해주면 됨
    {% if blog.image %}
    <p><img src="{{ blog.image.url }}" alt=""></p>
    {% endif %}

결과창 :

좋은 웹페이지 즐겨찾기