- HTML form, input 태그를 통해서 데이터를 입력 받음
- 입력된 데이터가 필요한 데이터 형식에 맞는지 유효성 검증이 필요.
- Django From은 그것에 할애되는 과중한 작업과 반복코드를 줄여줌
- 렌더링을 위한 데이터 준비 및 재구성
- 데이터에 대한 HTML forms 생성
- 클라이언트로부터 받은 데이터 수신 및 처리
개요
- Form Class
- Model Class를 선언하는 것과 유사
- Model과 마찬가지로 상속을 통해 선언(forms 라이브러리의 Form 클래스를 상속 받음)
활용
- 앱 폴더에 forms.py를 생성 후 ActicleForm Class 선언
from django import forms
class ArticleForm(forms.Form):
title = forms.CharField(max_length=10)
content = forms.CharField()
- form에는 model field와 달리 TextField가 존재하지 않음
- 모델의 TextField처럼 사용하려면 다른 방법을 사용해야함
- view 업데이트
def create(request):
if request.method == 'POST':
title = request.POST.get('title')
content = request.POST.get('content')
article = Article(title=title, content=content)
article.save()
return redirect('articles:detail', article.pk)
else:
form = ArticleForm()
context = {'form':form}
return render(request, 'articles/create.html',context)
- create 템플릿 업데이트
{%$ extends 'base.html' %}
{% block content %}
<h1>Create</h1>
<form action="{% url 'articles:create' %}" method="POST">
{% csrf_token %}
{{ form.as_p }}
<input type="submit">
</form>
<hr>
<a href="{% url 'articles:index' %}">List</a>
{% endblock content %}
Form rendering options
- <label> & <input> 쌍에 대한 3가지 출력 옵션
- as_p(): 각 필드가 단락(<p>)으로 감싸져서 렌더링
- as_ul(): 각 필드가 목록 항목(<li>)으로 감싸져서 렌더링(ul태그는 직접 작성)
- as_table(): 각 필드가 테이블(<tr>)행으로 감싸져서 렌더링
- Django의 2가지 THML input 요소 표현
- Form fields
- 입력에 대한 유효성 검사 로직을 처리
- 템플릿에서 직접 사용됨
- Widgets
- 웹페이지의 HTML input 요소 렌더링을 담당
- 단순히 input 요소의 보여지는 부분을 변경
- Widgets은 반드시 form fields에 할당됨
ModelForm
- 모델과 폼의 연관성이 크기에 Model을 기반으로 Form을 만들어줌
- ModelForm Class
- Model을 통해 Form Class를 만들 수 있는 helper class
- ModelForm은 Form과 똑같은 방식으로 view 함수에서 사용
ModelForm 선언
- forms 라이브러리에서 파생된 ModelForm 클래스를 상속받음
- 정의한 ModelForm 클래스 안에 Meta 클래스를 선언
- 어떤 모델을 기반으로 form을 작성할 것인지에 대한 정보를 Meta 클래스에 지정
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
- Meta Class
- ModelForm의 정보를 작성하는 곳
- ModelForm을 사용할 경우 참조할 모델이 있어야 하는데, Meta class의 model 속성이 이를 구성함
- 참조하는 모델에 정의된 field 정보를 Form에 적용함
- fields 속성에 ‘all’를 사용하여 모델의 모든 필드를 포함할 수 있음
- 또는 exclude 속성을 사용하여 모델에서 포함하지 않을 필드를 지정할 수 있음
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
exclude = ('title',)
ModelForm 구현
Create
Update
Form과 ModelForm
- ModelForm과 Form은 우열관계가 아닌 역할이 다른 관계
- Form
- 사용자의 입력을 필요로 하며 직접 입력 데이터가 DB 저장에 사용되지 않거나 일부 데이터만 사용될 때
- ModelForm
- 사용자의 입력을 필요로 하며 입력을 받은 것을 그대로 DB 필드에 맞춰 저장할 때
- 데이터의 유효성 검사가 끝나면 데이터를 각각 어떤 레코드에 맵핑해야할지 이미 알고 있기 때문에 곧바로 save() 호출이 가능
Widgets
'Programming Language > Django' 카테고리의 다른 글
Django 09)Authorization/Authentication_1 (0) | 2023.04.12 |
---|---|
Django 08)Static/Media (0) | 2023.04.11 |
Django 06) CRUD_2 (0) | 2023.04.11 |
Django 05) CRUD_1 (0) | 2023.04.11 |
Django 04) SQLite 기초 (0) | 2023.04.11 |