Django에서는 form을 생성하는 클래스를 제공한다. 이는 django.forms.Form클래스를 상속해서 만들 수 있다.
class NameForm(forms.Form):
# CharField타입의 디폴트는 TextInput위젯이다. 만약 textarea로 변경하려면 widget=forms.Textarea로 변경해주어야한다.
your_name = forms.CharField(label="Your Name",max_length=100)
your_name2 = forms.CharField(label="Your Name 2", max_length=100, widget=forms.Textarea)
위 예제는 두개의 필드가 있는 폼 클래스이다. 기본적으로 label속성은 각 <input>별 <label>태그의 값을 의미하고, 이는 실제로 렌더링 될때 <label>태그와 <input>태그가 쌍으로 렌더링이 된다. max_length는 최대 몇자까지 입력할 수 있는지를 제한할 수 있다. 위 예시에서 사용한 CharField같은 경우, Default가 TextInput이다. 그렇기 때문에 만약 Textarea로 바꾸고 싶다면 widget 속성을 forms.Textarea로 바꿔주면 된다. 더 많은 종류의 field타입들은 아래 링크에서 참고하면 된다
https://docs.djangoproject.com/en/4.0/ref/forms/fields/
Django의 폼 클래스는 모든 필드에 대해 유효성 검사 루틴을 실행시키는 is_valid()메소드가 있다. 이 메소드를 호출해 유효성 검사를 하고 만약 모든 필드가 유효하다면 아래 2가지 일을 순차적으로 진행한다.
- True를 반환한다
- form데이터를 cleaned_data 속성에 넣는다.
위의 form 클래스 랜더링 결과에 submit버튼이 없는데, 이는 직접 넣어주어야 한다.
폼 클래스를 처리할때 View는 두가지가 필요하다. 하나는 GET메소드를 이용해서 Form을 보여주는 뷰이고, 하나는 POST메소드를 이용해서 Form을 처리하는 뷰이다. 이를 두개로 나는것 보다, 하나로 합치는것이 권장된다. 이를 합치기 위해서는 아래와 같이 요청에 대한 Http 메소드를 확인해서 구별하면 된다.
def test(request):
if request.method == 'POST':
form = NameForm(request.POST)
if form.is_valid():
print("Form is valid")
print(f"name : {form.cleaned_data['your_name']}")
print(f"name2 : {form.cleaned_data['your_name2']}")
return redirect('polls:test')
else:
form = NameForm()
return render(request,'inheritTest/child.html',{'form' : form})
이제 한번 작성한 form클래스를 템플릿에 출력해 보자. 테스트를 위해서 form.is_valid()가 true인 경우, 각 필드의 값을 출력하는 형식으로 view를 작성해 보았다.
보면 위에 지정한 두 form이 잘 나오는것을 알 수 있다.
위의 예시는 그냥 form클래스의 랜더링 결과를 반환하였다. 그렇기 때문에 위와 같이 한줄로 inline형식으로 나오는것을 볼 수 있다. 이 form클래스를 템플릿을 변환하는 옵션이 3가지가 더 있다.
- {{ form.as_table }} : <tr>태그로 감싸서 테이블 셀로 렌더링 된다(디폴트이다)
- {{ form.as_p }} : <p> 태그로 감싸도록 렌더링 된다
- {{ form.as_ul }} : <li> 태그로 감싸도록 렌더링 된다
< as_p >
< as_ul >
'Back-End > Python Django' 카테고리의 다른 글
[Django] apps.py의 간단한 활용 (0) | 2022.03.05 |
---|---|
[django] 클래스형 뷰 (0) | 2022.03.01 |
[Django] 템플릿 상속하기 (0) | 2022.02.22 |
[Django][django template] 템플릿 시스템 (0) | 2022.02.18 |
[Django][django shell] 장고 파이썬 쉘로 데이터 조작하기 (0) | 2022.02.18 |