본문 바로가기
개발/Django

[Django] 게시판 만들어보기 - Part 6 (ModelForm을 활용한 변형)

by char_lie 2023. 3. 26.
반응형
반응형

Django를 이용하여 게시판을 만드는 과정을 따라가보자.

이 글은 아래 Part 5을 바탕으로 이어지니 참고하자

https://edder773.tistory.com/100

 

[Django] 게시판 만들어보기 - Part 5 (Form을 활용한 변형)

Django를 이용하여 게시판을 만드는 과정을 따라가보자. 이 글은 아래 Part 4을 바탕으로 이어지니 참고하자 https://edder773.tistory.com/94 [Django] 게시판 만들어보기 - Part 4 Django를 이용하여 게시판을 만

edder773.tistory.com

Form을 활용하여 게시판의 유효성 검증 및 단순화 할 수 있는 것을 알게 됐으니, 이젠 ModelForm을 활용해 더 Form을 쉽게 작성하는 과정을 배워보자


Django ModelForm

  • 단순 Form 사용은 Model이랑 중복되는 부분이 굉장히 많음 → ModelForm을 이용하면 더 쉽게 작성이 가능
  • Model을 통해 Form class를 만들 수 있는 helper class로 view에서 사용이 가능함
  • ModelForm 클래스를 정의 하고 그 안에 Meta 클래스를 선언해서 Meta 클래스 안에 어떤 모델 기반으로 form을 작성할 것인지 구성할 수 있음
  • Modelform의 설계가 클래스 내부(Modelform)에 클래스(Meta) 선언 방식으로 되어 있는 특정을 가짐

실습

이번에도 실제 코드를 작성하면서 따라가보자.

forms.py에 들어가 모델 폼을 사용하기 위해 기존 내용을 바꾸어보자. 아래의 코드와 같이 변형하면 된다.

from django import forms
from .models import Article

class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = '__all__'

field 속성으로 __all_을 사용하여 모델의 모든 필드를 포함했지만, exclude 속성을 이용하여 필요하지 않은 필드를 제외할 수도 있다.

이제 view에 Modelform을 적용하기 위해 수정을 진행해보자.

위 create를 보면 유효성 검사를 위한 is_valid() method를 사용할 수 있다. 유효성을 검사해서 통과할 경우 article에 form에 에 저장 될 수있도록 save() method를 사용했다.

기존과 다르게 else와 if에 중복되는 부분이 생기니, 중복 로직을 사용하여 간략화해서 작성했다.

이제 create뿐 아니라 update도 modelform을 활용해서 데이터를 수정해보자.

Create와 비슷하게 수정해주면 되고, 다른점은 여기서 instance를 사용한다.

instance 여부를 통해 생성할 건지, 수정할 건지 결정 됨 (없을경우 새 인스턴스 생성(create), 있을 경우 수정(update))

view의 수정을 완료했다면, update.html도 form형태로 수정해주자

여기까지 작성을 완료했다면. 서버를 실행해 정상 작동 여부를 확인해보자.

먼저 글쓰기를 작성하고, 폼에 아무것도 작성하지 않고 제출하기를 누르면

유효성 검사가 잘 동작하는 것을 확인할 수 있고, 마찬가지로 수정하기를 시도하면

수정하기도 유효성 검사가 잘 동작하는 것을 확인할 수 있다.


Widgets

  • 앞서 Form에서 textarea 위젯을 사용했던 것처럼 ModelForm에서도 위젯을 사용하여 수정 할 수 있음.
  • ModelForm 내부, Meta class 밖에 작성하거나 Meta class 내부에 작성하는 방법이 있는데 전자의 방식이 권장 됨

 

Form vs ModelForm?

  • Form
    • 사용자의 입력이 필요하고, 직접 입력 데이터가 DB 저장에 사용되지 않거나 일부 데이터만 사용 될 때 사용
  • ModelForm
    • 사용자의 입력을 필요로 하며 입력 받은 것을 DB에 바로 저장할 때 사용
    • 데이터 유효성 검사가 끝나면 어떤 레코드에 맵핑이 되는지 정해져 있기에 save()를 통해 바로 호출하여 사용 가능

다음 포스팅은 이제 게시판 내부에 이미지 등을 넣을 수 있게 하는 과정을 진행해볼 예정입니다~

반응형

댓글