Backend/Python

form 이미지 업로드

비비빅B 2020. 4. 22. 23:40

텍스트 업로드

views.py

def create(request):
    new = Diary()
    new.title = request.GET['title']
    new.body = request.GET['body']
    new.pub_time = timezone.datetime.now()
    new.save()
    return redirect(new)
  • 클래스 인스턴스 생성

  • request.GET["html name"]으로 value 가져옴

  • save메소드로 저장

  • get_absolute_url을 이용해 디테일 페이지로 이동


이미지 업로드

models.py

class Diary(models.Model):
    title = models.CharField(max_length=20)
    image = models.ImageField(upload_to="image/")
    body = models.TextField()
    created_date = models.DateTimeField(auto_now_add=True)

    def get_absolute_url(self):
        return resolve_url('diary:detail', self.id)
<form action="{% url 'diary:create' %}" method="POST" enctype="multipart/form-data">
    {% csrf_token %}
    <h4>제목: </h4>
    <input type="text" name="title">
    <h4>본문: </h4>
    <textarea cols=40 rows=10 name="body"></textarea>
    <input type="file" name="image"> 
    <input type="submit" value="제출하기">
</form>
  • form 속성 enctype="multipart/form-data" 추가

  • enctype은 폼 데이터가 서버로 제출될 때 해당 데이터가 인코딩되는 방법

  • multipart/form-data는 파일이나 이미지가 전송될 때 사용

  • method="POST"일 때만 사용 가능

views.py

def create(request):
    diary = Diary()
    diary.title = request.POST['title']
    diary.body = request.POST['body']
    diary.image = request.FILES['image']
    diary.save()
    return redirect(diary)
  • request.FILES로 받으면 됨

  • 나머지는 텍스트 업로드랑 동일


장고 폼으로 이미지 업로드

from django import forms
from .models import Diary


class DiaryPost(forms.ModelForm):
    class Meta:
        model = Diary
        fields = "__all__"
def create(request):
    if request.method == "POST":
        form = DiaryPost(request.POST, request.FILES)

        if form.is_valid():
            diary = form.save()
            return redirect(diary)

        else:
            form = DiaryPost()
            return render(request, "diary/create.html")

    else:
        form = DiaryPost()
        return render(request, "diary/create.html", {"form": form})
  • request.POST와 request.FILES에 데이터가 담겨 있음

  • 인자로 받아주면 form.data와 form.files에 각각 대입됨

  • 그리고 form.is_bound = True 로 바뀜

  • True여야지 is_valid()가 유효함