Archive

[Django] Form 본문

------ Web ------/Backend

[Django] Form

enent 2022. 7. 3. 14:41
반응형

1. HTML Form

  •  <form> ~ </form> 사이에 있는 element들의 집합이며 사용자 입력을 받기 위해 사용된다
    - <input>
    - action : form 데이터를 어디로 보낼지 지정
    - method : POST
  • 폼에 입력된 텍스트, 항목 등의 데이터는 서버로 보내지며, 데이터 전송시 POST 방식만을 사용한다.
    - POST : 서버 시스템 상태를 바꾸는 요청
       ( cf. GET : 서버 시스템 상태를 바꾸지 않는 요청 - URL에 데이터가 포함되어 검색에 적절)

 

 

2. Django Form

Form 데이터 처리과정

Form 화면 선택 -> HTML 렌더링 -> Interface를 통한 입력 및 수정 -> 서버에서의 데이터 유효성 검증 -> 저장/전달

 

Django 제공 기능

  • Form 생성에 필요한 데이터를 Form Class로의 구조화
       * Form Class : <input>에 매핑되며, Form을 작성하고 어떻게 작동하고 어떻게 보일지를 결정
  • Form Class의 데이터를 렌더링하여 HTML 폼 생성
    ① 렌더링할 객체를 View로 가져옴 (ex. DB로부터 객체 추출)
    ② 해당 객체를 Templete System으로 넘겨줌
    ③ HTML 마크업 언어로 변환

        - Form 객체 특성 상 렌더링 이후에 사용자가 데이터를 채우게 되므로, 빈 객체를 랜더링하는 일이 잦다. 이때 저장된 모델 객체 혹은            직전에 제출된 HTML Form으로 부터 데이터를 채울수도 있고, 비어있거나 디폴트 값으로 채워 보여줄 수도 있다.

  • 제출된 Form 수신 및 처리

 

3. Form Class

ex) POST방식을 이용하여 브라우저에게 Form 데이터를 URL/your-name/으로 보내달라는 요청

      : Form 이 제출되면 Post요청에 Form 데이터가 서버로 보내짐 -> 데이터에서 name /value 쌍을 찾아 URL/your-name/ 에
        해당하는  View 의 로직에 따라 name /value 쌍을 찾아 처리한다 

<form action="/your-name/" method="post">
	<label for = "your_name"> Your name: </label>
    <input id="your_name" type="text" name "your_name" value="{{ current_name }}">
    <input type="submit" value="OK">
</form>

 

위의 요청을 구현하기 위해 장고에서 구현하는 방법은 아래와 같다.

 

1) Form Class 정의

  • 각 Form Field는 Widget Class를 가지고 있고, 이는 <input type="text">와 같은 HTML 폼 위젯으로 대응된다.
    (ex. Char Field : Text Input Widget이 Default, <input type="text">로 변환)
  • Form Class는 유효성 검사를 실행하는 is_valid()메소드를 통해 모든 필드가 유효한지를 확인한다.
from django import forms

class NameForm(forms.Form):
    your_name = forms.CharField(label='Your name', max_length=100)

 

 

Form Class가 렌더링되면 아래와 같은 HTML 폼이 생성된다.

 

<label for="your_name">Your name: </label>
<input id="your_name" type="text" name="your_name" maxlength="100">

 

2) 템플릿 코드 수정

  • {{ form }} 변수에 Form Class가 들어있다.
  • 변수 생성시 옵션으론 {{ form }} 이외에도 3가지  옵션이 추가로 존재한다
    - {{ form.as_table }} : <tr> 태그로 감싸서 테이블 셀로 렌더링
    - {{ form.as_p }} : <p> 태그로 감싸서 렌더링
    - { form.as_ul }}  : <li> 태그로 감싸서 렌더링
<form action="/your-name/" method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit" />
 </form>

 

4. Form Class Processing in View

  • Form을 처리하기 위해서는 Form을 보여주는 View / 제출된 Form을 처리하는 View / 유효하지 않은 From을 처리하는 View 총 세 개가 필요하다. (아래 예제에선 두개만 고려함)
  • Django에선 하나의 View로 Form을 처리한다.
    - GET 방식으로 요청을 받은 경우 처음 폼을 보여주고, POST 방식으로 요청을 받은 경우 제출된 폼을 처리하여 결과를 보여준다

 

Ex)

from django.shortcuts import render
from django.http import HttpResponseRedirect

def get_name(request):
	if request.method == "POST":
		form = NameForm(request.POST)
        if form.is_valid():
        	new_name = form.cleaned_data['name']
            
            return HttpResponseRedirect('/thinks/')
    else:
    	form = NameForm()
        
    return render(request, 'name.html', {'form' : form}}

 

 

파이썬 웹 프로그래밍  - 4. Django 핵심기능
반응형

'------ Web ------ > Backend' 카테고리의 다른 글

[Django] Book Application 개발 (실습3)  (0) 2022.07.13
[Django] Class-based View  (0) 2022.07.04
[Django] Template System  (0) 2022.06.28
[Django] Admin  (0) 2022.06.26
[Django] View / Template Coding Overview (실습2)  (0) 2022.06.26
Comments