안녕하세요
이번 시간에는 Django에서 Form과 ModelForm에 대해 알아보고
form.save()와 form.save(commit=False)의 차이점에 대해 알아보겠습니다.
0. 사전 준비하기 (템플릿 확장, Bootstrap4)
[Django] Django에서 템플릿 확장의 개념과 템플릿 확장 적용하는 방법 실습하기 (tistory.com)
[Django] Bootstrap4에 대해 알아보고 Django에 Bootstrap4 부트스트랩 적용하기 (tistory.com)
실습을 진행하기 앞서 개발 환경을 맞추고자 Django 템플릿 확장과 Bootstrap4를 적용해야 합니다.
1. Form과 ModelForm 이란?
기본적으로 Form과 ModelForm은 Django에서 폼을 사용한다는 점에서 같습니다. 그러면 어떠한 차이가 있을까요.
1. Form
# forms.py
from django import forms
# 일반 폼(Form)
class BlogForm(forms.Form):
name = forms.CharField()
email = forms.EmailField()
comment = forms.CharField(widget=forms.Textarea)
Django의 Form은 HTML 폼을 표현하고 유효성 검사를 수행할 수 있는 파이썬 클래스입니다. Form 클래스는 모델과 연결되어 있지 않으므로, 모델에서 제공하는 필드 외에도 Form 클래스에서 추가적인 필드를 정의할 수 있습니다. 이러한 Form 클래스는 웹 어플리케이션에서 사용자 입력 데이터를 수집하고 처리하기 위해 사용됩니다.
2. ModelForm
#models.py
from django.db import models
#ModelForm model
class Blog(models.Model):
name = models.CharField(max_length=255)
email = models.EmailField()
comment = models.TextField()
### 객체를 문자열로
def __str__(self):
template = '{0.name} {0.email} {0.comment}'
return template.format(self)
###
# 마이그레이션 파일 만들기
python manage.py makemigrations
# 마이그레이션 적용하기
python manage.py migrate
ModelForm은 모델과 연결되어 있기 때문에 모델을 정의하고 마이그레이션을 한 후 ModelForm을 사용할 수 있습니다.
# forms.py
from django import forms
from .models import Blog
# 모델 폼(ModelForm)
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['name', 'email', 'comment']
Django의 ModelForm은 모델과 연결된 폼 클래스입니다. ModelForm 클래스는 모델에서 정의된 필드들과 연결되어 있으므로, 모델에서 정의된 필드들을 쉽게 Form 클래스에서 사용할 수 있습니다. ModelForm 클래스를 사용하면, 데이터 모델의 내용을 사용자에게 제공하고, 사용자가 제공한 데이터를 이 모델과 연동하여 저장할 수 있습니다. 이러한 ModelForm 클래스는 모델과 Form 클래스 간의 중복을 줄이고, 편리하게 데이터 입력과 수정을 가능케 합니다.
따라서, Form 클래스는 모델과 직접적으로 연결되어 있지 않으므로, 모델과 상관 없이 사용자 입력 데이터를 수집하고 처리할 수 있습니다. 반면, ModelForm 클래스는 모델과 연결되어 있으므로, 모델에서 제공하는 필드를 사용하여 웹 어플리케이션에서 사용자 입력 데이터를 쉽게 처리할 수 있습니다.
2. form.save()와 form.save(commit=False)의 차이점
Django에서 Form 클래스나 ModelForm 클래스를 사용하여 사용자 입력 데이터를 처리할 때, save() 메서드를 사용하여 데이터를 저장할 수 있습니다. 그러나 save() 메서드를 사용할 때, commit=False를 추가하여 호출할 수도 있습니다.
1. form.save()
form.save() 메서드는 Form 클래스나 ModelForm 클래스에서 호출될 때, 입력된 데이터를 데이터베이스에 바로 저장합니다. 즉, 이 메서드를 사용하면 데이터가 바로 저장되므로, 중간에 오류가 발생하면 데이터베이스에 저장된 데이터도 삭제되어야 할 수도 있습니다.
2. form.save(commit=False)
form.save(commit=False) 메서드는 입력된 데이터를 데이터베이스에 저장하지 않고, 메모리에만 저장합니다. 이 메서드를 사용하면, 데이터베이스에 저장하기 전에 추가적인 유효성 검사나 처리를 수행할 수 있습니다. 이후에 데이터를 저장하기 위해서는, 다시 form.save() 메서드를 호출하여 데이터베이스에 저장할 수 있습니다.
3. form.save()와 form.save(commit=False) 실습하기
1. View 만들기: form.save()가 적용된 경우
# views.py
from django.shortcuts import render, redirect
from .forms import *
from .models import *
def test(request):
if request.method == 'POST':
form = BlogForm(request.POST)
if form.is_valid(): #폼 유효성 검사
form.save() #form.save를 한 경우
return redirect('test')
else:
form = BlogForm
post = Blog.objects.all()
return render(request, 'base.html', {'form':form, 'post':post})
다음은 form.save() 예시 코드이며 form.is_valid()를 통해 유효성 검사를 하고 데이터베이스에 저장하는 코드입니다.
2. 템플릿 만들기
<!-- base.html -->
<!DOCTYPE html>
<html>
{% include 'head.html' %}
<body>
{% block content %}
<form action="" method="post">
{% csrf_token %}
{{ form.as_p }}
<button type="submit">제출하기</button>
</form>
{{ post }}
{% endblock %}
</body>
</html>
다음 코드는 템플릿 파일입니다. {{ form.as_p }}를 통해 만들어준 폼을 출력하는 템플릿 코드입니다.
3. URLconf 설정하기
# urls.py
from django.urls import path
from .views import *
urlpatterns = [
path('', test, name='test'),
]
다음 코드는 URLconf 설정입니다. views.py의 test 함수와 매핑합니다.
4. 서버 실행하기
python manage.py runserver
Form에 입력하고 [제출하기]를 눌렀을 때 데이터베이스에 바로 저장되어 출력되는 것을 확인할 수 있습니다.
5. View 만들기: form.save(commit=False)가 적용된 경우
# views.py
from django.shortcuts import render, redirect
from .forms import *
from .models import *
def test(request):
if request.method == 'POST':
form = BlogForm(request.POST)
if form.is_valid():
form.save(commit=False) #form.save(commit=False)를 한 경우
return redirect('test')
else:
form = BlogForm
post = Blog.objects.all()
return render(request, 'base.html', {'form':form, 'post':post})
다음은 form.save(commit=False) 예시 코드이며 form.is_valid()를 통해 유효성 검사를 하고 데이터베이스에 저장하는 코드입니다.
Form에 입력하고 [제출하기]를 눌렀을 때 데이터베이스에 바로 저장되지 않는 것을 확인할 수 있습니다.
오늘은 Django에서 Form과 ModelForm에 대해 알아보고 form.save()와 form.save(commit=False)을 간단한 실습을 통해 알아봤습니다.
감사합니다.
'Framework > Django' 카테고리의 다른 글
[Django] 리눅스(우분투)에 장고와 아파치 설치 및 연동하기-(2)(정적 파일, 에러 확인) (0) | 2021.06.30 |
---|---|
[Django] 리눅스(우분투)에 장고와 아파치 설치 및 연동하기-(1)(wsgi) (0) | 2021.06.30 |
[django] request.GET/request.GET.get MultiValueDictKeyError 해결 (0) | 2021.03.18 |
[Django] Select option 선택한 옵션으로 이동하고 선택한 값 GET으로 받기, 월별 데이터 출력하기 (2) | 2021.03.17 |
[Django] Django에서 Page에 대해 알아보고 페이징 처리하기 Pagination (2) | 2021.02.24 |
클라우드, 개발, 자격증, 취업 정보 등 IT 정보 공간
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!