본문 바로가기

웹 개발

[Django] Django form

Django Form Class

회원가입이나 게시물을 등록할 때, 입력 칸에 어떤 형식으로 넣어야 하는지 명시해 놓지만

유저들이 어떤 마음인지는 잘 모르지만(필자는 보통 실수) 꼭 다른 형식으로 입력하는 유저들이 있다.

그렇기 때문에, 유저가 입력하는 데이터는 반드시 유효성 검사가 필요하다.

하지만 그러면 form도 작성해야지, view도 작성해야지, 유효성 검사도 해야지 등등 필요한 일도 많아지고

그 과정에서 중복되는 코드들도 많이 생길것이다.

이 때 django는 일부 반복되는 작업과 코드를 줄일 수 있는 django form을 제공한다.

물론 직접 구현한 Form + View로직을 사용해도 상관없지만 어떻게 쓰는지는 알아두도록 하자.

 

Form 선언

# app/forms.py
from django import forms


class ArticleForm(forms.Form):
    title = forms.CharField(max_length=10)
    content = forms.CharField()

Model 선언과 비슷하게 내가 이 Form에서 입력받고자 하는 데이터에 대한 명세를 작성한다.

...
{{ form.as_p }}
...

적용하는 법은 내가 원하는 form태그 안에 이런식으로 써 넣으면 된다.

as_p에서 p는 <p>태그를 사용한다는 뜻으로 as_div 같이 바꿔 쓸 수 있다.

# views.py
from.forms import ArticleForm
...
def new(request):
	form = ArticleForm()
	context = {
		"form": form,
	}
	return render(request, "new.html", context)
...

선언한 클래스를 가져와서 context에 담아서 보내기만 하면 끝!

 

Django Model Form

그런데 Django Form 사용하다보니까 Model과 너무 유사하게 쓰게 된다는 생각이 든다. 그러면 Django가 알아서 Model을 참조해 Model Field를 보고 Form을 만들어주면 좋겠다는 생각을 하는데 Django는 이 기능을 제공해 준다.

 

Model을 통해서 Form Class를 만드는 방식

# forms.py
from django import forms

from articles.models import Article


class ArticleForm(forms.ModelForm):
    class Meta:
        model = Article
        fields = "__all__"
        exclude = ("title",)

ModelForm이 사용할 데이터를 Meta 클래스에 명시하고 fields 항목에 내가 form으로 만들고 싶은 항목들을 지정할 수 있다. exclude는 내가 제외할 field를 넣는 곳이다. (exclude는 보통 튜플 형식으로 쓴다)

# view에서 Django ModelForm 사용

def create(request):
  form = ArticleForm(request.POST) # form에 request.POST에 있는 데이터 채워
  if form.is_valid(): # form 형식에 맞으면
      article = form.save() # 저장하고 해당 객체 반환 
      return redirect("article_detail", article.id)
  return redirect("new")

POST method로 보내진 데이터 form을 form에 담고

만약에 유효성 검사(is_valid())를 통과하면 데이터베이스에 저장하고 해당 객체를 다시 반환해준다.

'웹 개발' 카테고리의 다른 글

[Django] 심화 과정에 들어가기 전 개념  (0) 2024.08.29
[Django] URL Namespace  (0) 2024.08.29
[Django] CRUD 구현하기 - 2(RUD부분)  (0) 2024.08.26
[Django] CRUD 구현하기 - 1(CR부분)  (0) 2024.08.23
[Django] Django ORM  (0) 2024.08.23