Study 모델 정의
→ ModelForm 작성
→ 폼에서 입력값 검증
→ form.save()로 모델 저장
스터디 모델을 1편에서 만들었잖아요?
그 모델이랑 연결되는 form을 만들라는거에용
모델과 연관성있는 것 무언가 입력을 받는 구조의 폼이라고 생각
Form은
그냥 입력창을 만드는 도구
어떤 값을 받을지 직접 다 적어줘야 함
저장도 직접 해야 함
즉, “입력만 받는 일반 양식”이라고 이해하시면 됩니다.
ModelForm은
모델을 기준으로 폼을 쉽게 만드는 도구
모델 필드를 바탕으로 입력창을 만들 수 있음
검증도 도와주고, form.save()로 DB 저장도 쉬움
즉, “모델이랑 연결된 폼”이라고 이해하시면 됩니다.
우리가 템플릿에서 보는 <form> 태그는
사용자가 값을 입력해서 보내는 HTML 영역이에요!
사용자가 입력한 값이 서버로 전달되면,
서버에서 ModelForm이 그 값을 받아 검증하고,
문제가 없으면 저장한다고 생각하시면 됩니당
study 앱에 폼을 만들고 그 폼이라는것은 그냥 앱 생성할때마다 만드는 폼이라고 생각하면되나요.. 그리고 그안에 CRUS페이지까지 스터디앱에 만드는거죠?
폼은 앱 만들 때 무조건 만드는 게 아니라, 사용자의 입력을 받아야 할 때 만드는 거예요! 항상 만드는건 아니에용 그리고 Study 앱을 만들었으니까, Study 관련 CRUD 페이지도 그 앱 안에서 같이 만듭니다
아니요, 둘 다 모델 파일과 독립적으로 사용할 수 있습니다.
forms.Form — 모델과 무관class ContactForm(forms.Form):
name = forms.CharField()
email = forms.EmailField()
message = forms.CharField(widget=forms.Textarea)
forms.ModelForm — 모델과 연결됨class StudyForm(forms.ModelForm):
class Meta:
model = Study # ← 특정 모델에 종속
fields = [...]
Meta.model에 연결할 모델이 필요form.save()로 DB에 바로 저장 가능| 구분 | 모델 필요 여부 | DB 저장 |
|---|---|---|
forms.Form | ❌ 불필요 | 직접 처리해야 함 |
forms.ModelForm | ✅ 필수 | form.save()로 자동 |
즉, ModelForm만 모델 파일에 해당되고, Form은 모델 없이 어디서든 독립적으로 사용할 수 있습니다.
forms.Form이 필요한 때모델에 저장할 필요 없이 입력값만 처리할 때 사용합니다.
# 예시 1 - 검색 폼
class SearchForm(forms.Form):
keyword = forms.CharField()
# 검색어를 받아서 필터링만 할 뿐, DB에 저장 안 함
# 예시 2 - 로그인 폼
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
# 인증만 하고 저장 X
# 예시 3 - 문의/이메일 폼
class ContactForm(forms.Form):
email = forms.EmailField()
message = forms.CharField()
# 이메일로 전송만 하고 저장 X
정확히는 구분해서 불러야 합니다.
| 용어 | 설명 | 예시 |
|---|---|---|
| 클래스(Class) | 설계도 전체 | StudyForm, LoginForm |
| 메서드(Method) | 클래스 안의 함수 | clean_minutes(), save() |
| 필드(Field) | 클래스 안의 변수/속성 | title, email |
class StudyForm(forms.ModelForm): # ← 클래스
title = forms.CharField() # ← 필드
def clean_minutes(self): # ← 메서드
...
그래서
StudyForm 자체 → 클래스clean_minutes() → 메서드forms.Form, forms.ModelForm → 클래스를 상속받는 것"Form이랑 ModelForm 메서드야?" 라고 하면 엄밀히는 클래스라고 표현하는 게 맞습니다.