HTML Form과 Django Form // django form(1)

2022. 4. 17. 05:15
  • 인프런 이진석 강사님의 장고 강의를 참고

django Form의 SERIALIZER와의 유사점

  • 결국 현업에서는 웹 api생성을 위해 drf를 만드는데, 그때 serializer를 사용하게 된다.
  • 그 serializer와 지금 포스팅의 주제인 Form의 전체적인 메커니즘이 굉장히 유사하다! 따라서 장고 form을 잘 이해한다면 drf도 쉽게 배울 수 있다!

1. HTML Form

  • 그냥 진짜 일반적인 HTML Form
  • 클라이언트에서 사용자에게 입력폼을 제공하고, 이를 서버로 전송하고자 할 때 사용함

 

HTML Form 필수 속성

  • action : 요청을 보낼 주소. 빈값("")으로 두면 현재 페이지 url로 요청을 보낸다
  • method : 전송 방식으로 Get(데이터 조회)과 Post(생성,수정,삭제)에 주로 사용
  • enctype : 인코딩 방식.
    • Get요청에서는 해당 속성의 값이 'application/x-www-form-urlencoded'로 강제됨.
      • 데이터를 Url의 querystring을 활용해 key&value형태로 전달하는 방식을 의미함.
      • ex) ~.com/?m=top&language=ko&location=Seoul...
      • 사실 Get요청에서는 주소뒤에 querystring을 활용한 방법으로 밖에 데이터를 전송할 수 없어서 , enctype속성값이 url-encoded로 강제되는 것임
    • Post요청에서는 다양하게 사용할 수 있음
      • multipart/form-data : 파일 업로드가 가능

 

Form 요청에서 인자를 보내는 두가지 방법

1)URL의 뒤에 ?를 붙이고 인자를 실어서 보내기

  • 앞서 언급한 x-www-form-urlencoded의 값만 실어서 보낼 수 있다.
  • 즉, querystring방식을 사용하는 것임
  • 일반적으로 get에 사용(물론 post에서도 쓸 수 있으며, 쓰이는 경우도 실제로 있다!)

2)요청 http메세지의 body에 모든 인코딩의 인자를 실어서 보냄

  • x-www-form-urlencoded / multipart/form-data 어떤 방식이든 가능
  • post메서드의 방식
  • get메서드는 쓸 수가 없다(get메서드의 http요청 메세지는 body가 없다)

 


2. Django Form

  • html form의 업그레이드 판 같은 게 아님!! 클라이언트에서 HTML form을 통해 전달한 값들을 전달 받은 후, 전달받은 값들에 대해 여러 기능을 수행하는, HTML Form과 다른 개념임!!
  • 다만 Get요청을 받았을 때 등, HTML Form을 생성해서 사용자에게 보여주는 기능이 있어서 마치 django Form이 HTML Form의 업그레이드 판 같은 느낌이 들 뿐임.
  • 장고를 더욱 장고스럽게 만들어주는 아주 주옥같은 Feature. 솔직히 django Form을 안쓰면 django를 쓸 필요가 없다고 생각될 정도임(by 이진석 강사님)

 

django form의 기능

  • 입력을 위한 HTML 생성(HTML FORM) 생성
  • 클라이언트에서 HTML Form을 통해 (보통 post메서드로)전달한 값들에 대해 ,유효성 검사를 실행하고 유효성 검사가 실행된 값들을 반환
  • 검증을 통과한 값들을 dict 형태로 제공

 

Django Model Form

  • 특정 모델에 맞춰서 만들어지는 Form.
  • 하나하나 필드를 설계해줘야 했던 Form과는 달리, class Meta값을 통해 어떤 모델과 그 모델의 어떤 필드를 사용할지만을 정해주면 돼서 굉장히 편리함.
  • 모델을 따라가므로, 모델 변경시(필드가 바뀐다든지) Form도 자동으로 바뀜
  • 또 모델에서 validator가 필드에 적용될 경우, 그냥 Form은 Form에서도 따로 적용시켜줘야 하는 반면 modelForm에서는 자동으로 적용이 됨
#forms.py
#modelform예시
from django import forms
from .models import Post

class PostForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'

 

django의 form처리 스타일

  • 하나의 URL로 호출되는 하나의 View에서 다음의 2가지 역할을 모두 수행
    1. Get으로 URL 접근시, 생성인자로 아무 값도 받지 않는 Form 객체를 만들어 템플릿에 전달
      • 즉 템플릿에 입력을 위한 빈 폼을 보여주는 것임
      • 장고폼의 입력을 위한 HTML 생성 기능이 사용된 것
    2. Post로 데이터를 전송시, 입력된 값에 유효성 검사를 실행하여 검증하고 저장하는 역할
      • 들어온 요청의 내용(request.POST, request.FILES)을 생성인자로 주면서 Form instance를 생성.
      • 참고)내가 헷갈렸던 부분인데, 폼에 담겨서 데이터가 들어오고 그 폼을 그대로 쓰는 게 아니라, 요청이 들어오면 요청 데이터를 받아서 해당 데이터가 들어간 폼 인스턴스를 새로 만들어 주는 것임
      • form.is_valid() >> 요청의 내용이 담긴 Form에 유효성 검사를 진행. 모든 필드의 값들이 검증에 성공하면 True를 반환
      • 유효성 검증이 성공하면, form.cleaned_data에 각 값들이 dict형태로 저장됨
      • 검증 성공시 데이터를 저장하고 SUCCESS_URL로 이동하고 실패 시 실패 시 오류 메세지와 함께 입력폼을 다시 보여주도록 함
def post_new(request):
    if request.method =="POST":
        form = PostForm(request.POST,request.FILES) #받은 데이터의 내용을 form에 채워넣음
        if form.is_valid(): #form전체필드 값들이 유효하면 > True반환
            post = form.save() #save():db에 값이 저장되면 저장된 모델 instance(한 행의 데이터)를 반환함
            return redirect(post)
            #get_absolute_url을 찾아감
    else:
        form = PostForm()
        
    return render(request,'instagram/post_form.html',{
        'form':form,
    })

 

 

BELATED ARTICLES

more