유효성 검사와 Django Form
숫자만 입력해야하는 필드에 유저가 문자를 입력하는 경우가 발생하는 경우가 발생할 수 있음
→이를 방지하기 위해 사용자 입력 데이터 유효성 검사
→Django에서는 Form클래스를 제공하여 유효성 검사와 Form 구성을 간편하게 처리
(Django의 Form을 사용하지 않고 이전에 직접 구현한 Form과 View 로직을 사용해도 무방함)
Django Form Class - Django Form 선언
Form을 View에 적용
Template에서 Form 렌더링
form.as_p를 사용하면 각 필드가 <p>태그로 감싸진 형태로 렌더링 됨
*Django의 렌더링 옵션
https://docs.djangoproject.com/en/4.2/topics/forms/#form-rendering-options
Django Form의 Widget 사용
Form Widget을 사용하면 HTML의 <input>요소가 어떻게 렌더링될지를 정의할 수 있음
https://docs.djangoproject.com/en/4.2/ref/forms/widgets/#module-django.forms.widgets
TextArea위젯을 적용하는 경우
ChoiceField를 사용(선택 옵션이 필요한 경우)
'ChoiceField'는 데이터베이스에 저장될 값과 사용자에게 보여질 값을 명시적으로 구분할 수 있음
모델 수정해주고 view, template 수정과 DB스키마 맞추기
default값 안적어주니까 migrations할 때 오류남
python manage.py makemigrations 앱이름
python manage.py migrate
Django ModelForm 사용
ModelForm
기존 Model을 기반으로 Form을 자동 생성할 수 있음
→ 반복되는 필드 정의를 줄이고 유효성 검사와 데이터 저장을 간소화 가능
ModelForm 선언
ArticleForm을 사용하면 Articles모델의 필드에 맞는 입력폼을 Django가 자동으로 생성해줌
(내가 만든 articles앱의 models.py에 정의된 Articles 모델 참조하여 자동생성)
model 속성에 참조할 모델을 지정
Meta 클래스를 활용해 ModelForm이 사용할 Model과 필드를 지정
fields = "__alll__"
모든 필드를 포함할 수 있으며, 특정 필드를 제외 시
exclude = ["제외할 필드"]
와 같이 설정
ModelForm을 활용한 View
유효성검사 가능
new와 create를 통합하여 create view를 사용 - 코드 간결화
request:method가 POST인 경우 사용자의 입력 데이터를 검증한 후 저장
유효하지 않은 데이터는 다시 create.html에서 사용자에게 표시
update View 구현
기존의 데이터를 수정할 경우 instance 속성을 활용하여 기존 데이터를 채운 상태의 Form을 렌더링
instance 속성을 사용하여 특정 데이터와 연결된 Form을 생성
form.save()는 instance값이 있으면 해당 객체를 수정하고, 없으면 새 객체 생성
Django Form vs. ModelForm
Django Form | ModelForm | |
정의 | 사용자 입력을 처리하기 위해 수동으로 필드를 정의하는 폼 | Django 모델을 기반으로 자동으로 폼을 생성하는 폼 |
필드 정의 방식 | forms.py에서 직접 필드 하나하나 지정 | models.py의 모델을 참조하여 자동으로 필드 생성 |
데이터 저장 방식 | 데이터 저장을 직접 처리해야 함 (form.cleaned_data 사용) | form.save() 메서드를 사용하여 모델 인스턴스를 쉽게 저장 가능 |
유효성 검사 | 사용자가 직접 검증 로직을 작성해야 함 | 모델의 필드 속성 (max_length, unique=True 등)을 기반으로 자동 유효성 검사 적용 |
코드 중복 | Model과 Form을 따로 정의해야 해서 코드 중복 가능성 높음 | 모델을 기반으로 자동 생성되므로 중복 코드 최소화 |
사용 사례 | 모델과 관계없이 독립적인 입력 폼이 필요할 때 (예: 검색 폼, 로그인 폼) | 특정 모델과 연관된 입력 폼을 만들 때 (예: 게시글 작성, 회원 가입) |
→Django Form은 모델과 무관하게 사용자 입력을 받는 폼을 정의할 때 사용됨
→ModelForm은 특정 모델을 기반으로 폼을 자동 생성하여 중복 작업을 줄이고 데이터 저장을 간소화하는 데 유용
→둘 다 Django의 Form 시스템을 기반으로 동작하지만, ModelForm은 모델과 직접 연결된다는 점에서 차이가 있음
즉, ModelForm은 Django Form의 확장된 형태
모델과 관련 없는 폼이 필요할 때는 Django Form을 직접 사용하는 게 적절
'∟Framework > ∟Django' 카테고리의 다른 글
Django - Auth (0) | 2025.02.04 |
---|---|
Django - URL Namespace (0) | 2025.02.02 |
Django - MTV 패턴을 활용한 RUD(Read, Update, Delete) 구현 (0) | 2025.01.22 |
Django - MTV패턴을 활용한 C(Create)와 R(Read) 구현 (0) | 2025.01.18 |
Django - ORM(Object-Relational Mapping) (1) | 2025.01.14 |