본문 바로가기

WEB/Django

Django(장고) 구축 코드로 일단 따라해보기(2)

https://www.youtube.com/watch?v=gHCyMBqv_U0&list=PLvX6vpRszMkwECdbxNX8s9R-vcUFGqqtC&index=9

 

1. django_web/settings.py

이미지 파일을 저장할 폴더 위치 설정

# 이미지 파일을 저장할 폴더 위치
MEDIA_URL = '/media/'
MEDIA_ROOT= os.path.join(BASE_DIR, 'media')

 

2. webapp/urls.py

from django.conf.urls import url
from . import views

from django.conf import settings 
from django.conf.urls.static import static

# 어떤 글자가 들어오던지 views의 first_view 함수로 가라
# /uimage 로 들어오면 views의 uimage 함수로 전달해라
urlpatterns = [
    url(r'^$', views.first_view, name='first_view'),
    url(r'^uimage/$', views.uimage, name='uimage'),
]

# 이미지 파일을 업로드 하기 위한 설정
urlpatterns += static(settings.MEDIA_URL,
    document_root=settings.MEDIA_ROOT)

 

3. webapp/views.py

 

이미지 업로드, 이미지 저장 후 

from django.shortcuts import render
from .forms import UploadImageForm  # 이미지 업로드 form
from django.core.files.storage import FileSystemStorage  # 이미지 저장

# urls에서 요청이 오면 first_view로 오는데, 이 때 ~.html을 rendering 해줘라
def first_view(request):
    return render(request, 'webapp/first_view.html', {})

def uimage(request):
    if request.method == 'POST':
        form = UploadImageForm(request.POST, request.FILES)  # 이미지르 업로드할때 쓰는 form
        if form.is_valid():
            myfile = request.FILES['image']
            # 
            fs = FileSystemStorage()  # 이미지 파일을 저장할때 쓰는 함수
            filename = fs.save(myfile.name, myfile)
            uploaded_file_url = fs.url(filename)
            return render(request, 'webapp/uimage.html', {'form': form, 'uploaded_file_url' : uploaded_file_url})
    else:
        form = UploadImageForm()
        return render(request, 'webapp/uimage.html', {'form': form})

 

4. webapp/forms.py

생성 후 입력 

 

from django.shortcuts import render
from .forms import UploadImageForm  # 이미지 업로드 form
from django.core.files.storage import FileSystemStorage  # 이미지 저장

# urls에서 요청이 오면 first_view로 오는데, 이 때 ~.html을 rendering 해줘라
def first_view(request):
    return render(request, 'webapp/first_view.html', {})

def uimage(request):
    # 글을 쓸때는 여기 수행
    # 글쓰기를 눌렀을땐 여기로
    if request.method == 'POST':
        form = UploadImageForm(request.POST, request.FILES)  # 이미지르 업로드할때 쓰는 form
        # form을 받아서 그게 유요한지 테스트 후 
        if form.is_valid():
            myfile = request.FILES['image']
            # 
            fs = FileSystemStorage()  # 이미지 파일을 저장할때 쓰는 함수
            filename = fs.save(myfile.name, myfile)
            # 이미지를 업로드 하고
            uploaded_file_url = fs.url(filename)
            # html로 렌더링
            return render(request, 'webapp/uimage.html', {'form': form, 'uploaded_file_url' : uploaded_file_url})
    # 보여줄 때는 이곳 수행
    # 제일 처음엔 form을 받아와서 uimage.html에 보내주고
    else:
        form = UploadImageForm()
        return render(request, 'webapp/uimage.html', {'form': form})

 

5. webapp/templates/webapp/uimage.html 생성

 

<!DOCTYPE html>
 <html lang="en">
 <head>
  <meta charset="UTF-8">
  <title>Title</title>
 </head>
 <body>
 
<h1>image upload example</h1>
  <form method="POST" class="post-form" enctype="multipart/form-data">
  {% csrf_token %}
  {{ form.as_p }}
  <button type="submit" class="save btn btn-default" value=""upload">save!!</button>
  </form>
 
{% if uploaded_file_url %}
  <img src="{{ uploaded_file_url }}">
  <p>File uploaded at: <a href="{{ uploaded_file_url }}">{{ uploaded_file_url }}</a></p>
  {% endif %}
 
<p><a href="{% url 'uimage' %}">Return to home</a></p>
 
</body>
 </html>

## 1. 우리 form이 보여지도록

  {{ form.as_p }}

 

## 2. 업로드 버튼 구현

  <button type="submit" class="save btn btn-default" value=""upload">save!!</button>
  </form>

 

## 3. 사진이 업로드되어 POST 모드 일 때 uploaded_file_url  변수가 정의가 되있으면 uploaded_file_url 를 가져와서 이미지를 보여주는 코드

{% if uploaded_file_url %}
  <img src="{{ uploaded_file_url }}">
  <p>File uploaded at: <a href="{{ uploaded_file_url }}">{{ uploaded_file_url }}</a></p>
  {% endif %}

 

 

6. 이미지 호출 함수 설치

>> pip install pillow

 

7. DB 업데이트

>> python manage.py migrate

 

8. 확인

>> python manage.py runserver 127.0.0.1:8000

>> 웹에서 확인 http://127.0.0.1:8000/uimage

 

html 창이 잘 뜨고, 업로드 후 이미지가 잘 보여지는 것을 확인할 수 있다