1번째 줄: |
1번째 줄: |
| [[분류:3-1. 장고 폼]] | | [[분류:3-1. 장고 폼]] |
− | 입력값을 바꾸려면... html에서 받을 폼을 수정해주어야 하고, 받을 모델을 변경해주어야 하는 불편함이 있다. 이러한 불편함을 해소하고자 장고에선 장고 form이라는 개념을 제공해 편의성을 제공한다. 폼을 만들고 html에 <nowiki>{{form}}</nowiki> 이라고만 입력하면 자동으로 html 언어로 변환해 보여준다. 모델의 제약 외에 폼에서의 제약을 설정하는 등 상세한 변형이 가능하여 많이 이용되는 개념이다.
| |
| | | |
− | 일반적으로 장고 폼을 이용해 입력을 받곤 하지만, 그건 편하다곤 해도 장고 외에서의 지식을 확장하기엔 어려움이 있어, 편리함을 포기하고 근본에 다가서는 방식으로 정리해본다.
| + | == 개요 == |
| + | 장고에선 장고 form이라는 개념을 제공해 데이터 입력의 편의성을 제공한다. 장고에서 제공하는, 데이터를 입력받는 기능이다. html을 자동 렌더링해준다. |
| | | |
− | 일단 일반적인 입력법을 다룬 후 장고에서 제공하는 폼 기능을 살펴보자.
| + | 폼을 만들고 html에 <nowiki>{{form}}</nowiki> 이라고만 입력하면 자동으로 html 언어로 변환해 보여준다. |
| | | |
| + | 모델의 제약 외에 폼에서의 제약을 설정하는 등 상세한 변형이 가능하여 많이 이용되는 개념이다. |
| | | |
− | | + | == 정의 == |
− | 장고에서 제공하는, 데이터를 입력받는 기능이다. html을 자동 렌더링해준다. 폼을 사용하기 위해선 폼 클래스를 정의해야 한다.
| + | 폼을 사용하기 위해선 폼 클래스를 정의해야 한다. |
− | | |
− | from djangoinport forms
| |
− | | |
− | class 폼이름(forms.Form):
| |
− | | |
− | 받을내용=forms.CharField(label='라벨이름', 속성)
| |
− | #각 필드타입에 대해 위젯이 준비되어 있다. 이는 속성으로 들어간다.
| |
− | | |
| | | |
| 일반적으로 앱의 forms.py 안에 정의한다.<syntaxhighlight lang="python"> | | 일반적으로 앱의 forms.py 안에 정의한다.<syntaxhighlight lang="python"> |
| from django import forms | | from django import forms |
| + | from .models import 모델 # 폼을 적용할 모델을 불러온다. |
| | | |
| class 폼이름(forms.Form): | | class 폼이름(forms.Form): |
− | | + | class Meta: |
| + | model = 모델 # 사용할 모델 |
| + | fields = ['필드1', '필드2',...] # 폼으로 입력할 필드를 입력해준다. |
| + | # fields에 '__all__'을 따옴표까지 함께 넣어주면 모든 필드를 가져오라는 명령이 된다. |
| </syntaxhighlight> | | </syntaxhighlight> |
− | ===폼필드 제약=== | + | |
| + | === 폼필드 제약 === |
| 클래스 변수로 <code>모델의 속성명 = forms.CharField(label='보여질이름', max_length=100)</code> 따위로 폼 안에서 입력의 제한조건을 걸 수도 있지만, 기왕 모델을 작성하는 거, 모델에서 제한조건을 완성하고 폼에선 보여지는 대상과 방식에 집중하자. | | 클래스 변수로 <code>모델의 속성명 = forms.CharField(label='보여질이름', max_length=100)</code> 따위로 폼 안에서 입력의 제한조건을 걸 수도 있지만, 기왕 모델을 작성하는 거, 모델에서 제한조건을 완성하고 폼에선 보여지는 대상과 방식에 집중하자. |
| + | |
| + | 폼 필드에 일일이 제약을 걸 수는 없으니, 모델에서 제약을 걸고 폼에서는 이를 사용하기만 한다. |
| | | |
| 어차피 모델에서 알아서 폼필드를 만든다.(모델은 유효성검사를 하고, 입력 자체를 막진 못한다. 그럴 때 사용하면 된다. 혹은 HTML 코드에서 입력의 제약을 걸 수도 있는데, 각 폼마다 제약을 거는 게 아니라 한번에 <nowiki>{{form}}</nowiki> 형식으로 불러올 거라면 이곳에서 제약을 걸어주어야 한다.) | | 어차피 모델에서 알아서 폼필드를 만든다.(모델은 유효성검사를 하고, 입력 자체를 막진 못한다. 그럴 때 사용하면 된다. 혹은 HTML 코드에서 입력의 제약을 걸 수도 있는데, 각 폼마다 제약을 거는 게 아니라 한번에 <nowiki>{{form}}</nowiki> 형식으로 불러올 거라면 이곳에서 제약을 걸어주어야 한다.) |
| | | |
− | 폼 필드에 일일이 제약을 걸 수는 없으니, 모델에서의 제약을 그대로 가져오기도 한다.<syntaxhighlight lang="python">
| |
− | class 폼이름(ModelForm):
| |
− | class Meta:
| |
− | model = 사용할 모델
| |
− | fields = ['필드1', '필드2',...] # 폼으로 입력할 필드를 입력해준다.
| |
− | # fields에 '__all__'을 따옴표까지 함께 넣어주면 모든 필드를 가져오라는 명령이 된다.
| |
− | </syntaxhighlight>
| |
| ===위젯=== | | ===위젯=== |
| 각 폼 필드는 <input type='text'>와 같은 HTML 위젯을 갖고 있다. 각 폼필드마다 기본적인 위젯을 갖고 있다. | | 각 폼 필드는 <input type='text'>와 같은 HTML 위젯을 갖고 있다. 각 폼필드마다 기본적인 위젯을 갖고 있다. |
| | | |
| 폼필드 안의 옵션에 속성=forms.CharFiedl(....., widget={'class'='클래스값', ...}) 와 같이 옵션을 추가해주면 된다.(역시, HTML에서 입력할 수 있기 때문에 분업을 하는 경우 굳이 사용하진 않는다.) | | 폼필드 안의 옵션에 속성=forms.CharFiedl(....., widget={'class'='클래스값', ...}) 와 같이 옵션을 추가해주면 된다.(역시, HTML에서 입력할 수 있기 때문에 분업을 하는 경우 굳이 사용하진 않는다.) |