form이란
웹사이트에서 사용자와 상호작용하기 위해 사용하는 수단이다.
사용자는 form을 통해서 글자를 작성하고, 버튼을 클릭하며, 옵션을 선택하게 된다.
입력된 form을 어떻게 활용할지에 관여하는 2가지가 있다.
1. where : 어떤 url로 보내질 것인지
2. how : 어떤 method로 보내질 것인지
POST와 GET
form을 활용하기 위해서는 how가 정해져야 한다고 했다.
how를 결정하는 두가지가 POST와 GET이다.
POST와 GET 둘다 서버에 정보를 전송하는 것은 같다.
POST는 정보를 묶어서 변형한 후(CSRF같이) 전송하는 반면
GET은 STRING 형태로 전송한다. 때문에 비밀번호같이 중요한 정보는 GET으로 보내지 않는다.
검색같은 것은 GET을 사용한다.
장고는 폼을 다루는데 어떤 도움을 주는가
세가지를 해준다.
1. 데이터를 재구성해서 렌더링 준비.
2. data를 html로 변환
3. 서버가 받은 정보를 핸들링
장고에서의 폼
html 코드인 <form>은 장고에서 일부일 뿐이다. 장고는 보다 논리적으로 form을 만들고 활용할 수 있게 돕는다.
클래스를 자동으로 html 코드로 렌더링 해주고, 뷰를 통해 데이터를 쉽게 다룰 수 있다.
장고 폼 클래스
클래스의 필드는 각각 폼의 입력과 대응된다.
마치 모델에서의 필드가 db의 열과 대응되는 것과 비슷하다.
클래스 내 위젯은 사용자가 해당 필드를 작성할 때 어떤 인터페이스를 볼 것인지를 결정한다.
대개 기본으로 정해져있지만, 오버라이딩을 통해 수정할 수도 있다.
폼 인스턴스화, 처리 및 렌더링
잘 이해가 안됨.
1. 뷰에서 명령 받음 ex) 데이터베이스에서 뭐 가져와라
2. 템블릿 맥락으로 이동
3. html 코드로 렌더링
렌더링 과정에서 빈 칸을 제공함으로써 사용자가 정보를 입력할 수 있게 됨.
form=UserCreationform()형식으로 비어있는 폼을 만들 수도 있고,
form=UserCreationform(request.post)형식으로 유저가 post한 정보를 form에 입력시키면서 인스터스화할 수도 있다.
---
예시: https://docs.djangoproject.com/en/4.2/topics/forms/#building-a-form-in-django
---
폼: 더 깊게 들어가보자
form은 django.forms.Form과 django.forms.ModelForm 두가지가 있으며, 큰 차이는 없다.
모델을 직접적으로 수정하는 경우에는 modelForm을 사용하는게 편하긴 하다.
Bound 폼과 UnBound 폼의 차이
is_bound 메소드를 통해 결합 여부를 확인할 수 있다.
unBound 폼의 경우 입력값이 없거나 기본값이 입력된 채로 렌더링된다.
반면 Bound 폼은 기존에 입력한 정보가 폼에 결합된 상태이며, is_valid를 통해 적절한 값이 들어있는지 확인할 수 있다.
is_valid가 False인 폼을 렌더링하려고 하면 에러가 날 수 있음.
필드에 대해 더 자세히 알아보자.
필드에는 꽤 다양한 것들이 있다. 자세히 알고 싶다면
https://docs.djangoproject.com/en/4.2/ref/forms/fields/
여기를 참고하자.
장고는 대개 적절한 위젯을 설정해주지만, <textarea>같은건 직접 설정해줘야 한다.
is_valid() 메소드를 실행한 이후에는, 폼의 정보들이 claned_data에 딕셔너리 형태로 저장된다.
이를 예시와 같이 응용할 수 있다.
from django.core.mail import send_mail
if form.is_valid():
subject = form.cleaned_data["subject"]
message = form.cleaned_data["message"]
sender = form.cleaned_data["sender"]
cc_myself = form.cleaned_data["cc_myself"]
recipients = ["info@example.com"]
if cc_myself:
recipients.append(sender)
send_mail(subject, message, sender, recipients)
return HttpResponseRedirect("/thanks/")
파일을 폼에 바인딩하려면 추가로 고려해야할 것이 있다고 한다.
https://docs.djangoproject.com/en/4.2/ref/forms/api/#binding-uploaded-files
를 참고하자.
폼 렌더링 옵션
{{form.as_p}} 등을 사용하면 원하는 형식으로 label과 input을 출력할 수 있다.
'웹개발' 카테고리의 다른 글
django model (0) | 2023.05.06 |
---|---|
cafe24 jdbc 연결 (0) | 2023.02.22 |
jsp 폼에서 서블릿 호출 안되는 문제 (0) | 2023.02.19 |
댓글