내 잡다한 노트
Form 본문
#개요
사용자 웹 인터페이스를 구성하는 것 중에서 Form은 사용자의 입력을 받기 위한 필드나 위젯들의
묶음을 의미한다. 우리가 자주 보는 로그인 화면이나, 글쓰기 화면 등에 데이터를 입력받는
입력 칸들과 버튼으로 이루어져 있다.
#기본적인 형태
<form action=”데이터가 전달될 주소(요청/이동할 주소)” method=”http 요청 방식">
<input type=”text” name=”title”/>
<button type=”submit”>입력</button>
</form>
method에서 http 요청 방식에는 GET, POST, PUT, DELETE가 있다. 보통은 GET, POST를 자주 사용한다
GET는 주소가 노출돼도 괜찮고, 다른 사용자에게 공유가 가능한 정보를 처리할 때 사용되고,
POST는 회원가입이나 결제와 같이 다른 사용자와 결제해서는 안되는 정보를 처리할 때 사용된다.
장고에서는 이러한 폼을 구성하기 쉽게 프레임워크에서 지원해준다.
모델 클래스의 모델 정보들과 연동할 수 있다.
Validation(입력된 정보들의 유효성 검사) 체크를 쉽게 해준다.
악의적인 데이터를 필터링 한다. (sanitisation) 해킹기법같은게 있다.
# CSRF token
서버에 들어온 요청이 실제 서버에서 허용한 요청이 맞는지 확인하기 위한 토큰
서버에서는 뷰 페이지를 발행할 때 랜덤으로 생성된 token을 같이 준 뒤 사용자 세션에
저장해둔다. 그리고 사용자가 서버에 작업을 요청할 때 헤이지에 숨겨있는 token 값이 같이
서버로 전송이 되고 서버에서는 이 token 값이 세션에 저장된 값과 일치하는지 확인하여
해당 요청이 위조된게 아니라는 것을 확인한다.
일치 여부를 확인한 token은 바로 폐기하고 새로운 뷰페이지를 발행할때마다 새로 생성한다.
def confirm(request):
form = PostForm(request.POST) # request의 POST 데이터들을 바로 PostForm에 담을 수 있습니다.
if form.is_valid(): # 데이터가 form 클래스에서 정의한 조건 (max_length 등)을 만족하는지 체크합니다.
return render(request, 'second/confirm.html', {'form': form})
return HttpResponseRedirect('second/create/') # 데이터가 유효하지 않으면 되돌아갑니다.
# Model Form
앞서 배운 form만으로도 데이터를 받아서 Post에 레코드를 추가할 수 있지만,
이렇게 할 경우 post에 속성이 추가되면 form도 그때 그때 수정해줘야하고 form으로 받은
데이터를 다시 꺼내서 모델 클래스의 인스턴스에 넣어주어야 하는 번거로움이 있다.
model form은 이것을 해결해준다.
# 기존의 Form
# class PostForm(forms.Form): # django의 폼을 상속
# title = forms.CharField(label='제목', max_length=200)
# content = forms.CharField(label="내용", widget=forms.Textarea)
# ModelForm
class PostForm(ModelForm):
class Meta:
model = Post # 어떤 모델 클래스를 사용할 것인지
fields = ['title', 'content'] # 입력받을 필드들
# Model Form으로 데이터 저장하기
기존에 작성된 views.py의 create 메소드에 GET로 요청이 들어왔을 때와 form을 통해
POST로 요청이 들어왔을 때를 구분해서 처리하도록 하자