# TIL 웹개발 - Django form 정리

우선 form은 클라이언트가 데이터를 조회하거나 전송할 때 사용하는 태그(tag)다.
게시글을 작성하는 form을 작성하면 아래 코드와 같다.

```javascript
# html에서 사용할 때

<form action="" method="">
  <label for="title">제목</label>  
  <input type="text" id="title" name="title">

  <label for="content">내용</label>
  <textarea id="content" name="content" cols=10 rows=10>
</form>
```

제목과 내용을 작성해 form형태로 서버에 전달해 처리한다.
이 form 형태를 쉽게 처리하는 기능을 django에서 제공하는데 D**jango model form**이다.

데이터베이스 모델에 대응하는 폼을 자동으로 생성해주는 기능으로 위 코드처럼 별도로 폼을 정의하지 않아도 된다.
그리고 데이터베이스 기준에 따라 (텍스트, 숫자 등) 형식을 맞추지 않을 경우 자동으로 경고 메시지를 보내주기도 한다.

### Django model form 

1. 모델과 폼의 자동 연결

- ModelForm을 사용하면, Django 모델에 정의된 필드를 기반으로 자동으로 폼 필드가 생성된다.

- 예를 들어, 모델에서 Charfield, DateField 등이 있다면, 해당 필드에 맞는 html 폼 필드가 생성된다.

2. 간편한 데이터 처리

- 모델 폼은 데이터의 유효성을 검사하고, 유효하다면 데이터베이스에 쉽게 저장할 수 있다.

- form.save() 메소드를 사용하면 폼데이터를 모델 인스턴스로 변환하고 저장할 수 있다.

3. 유효성 검사

- 모델 폼은 모델에서 정의된 필드의 유효성 검사(예: 최대 길이, 필수 입력 여부)를 자동으로 처리한다.

- 추가적인 커스텀 유효성 검살르 쉽게 정의할 수 있다.

### 모델 폼 정의하는 방법

Article 데이터베이스 / models.py

```javascript
from django.db import models

class Article(models.Model):
  title = models.CharField(max_length=50)
  content = modles.TextField()

  def __str__(self):
    return self.title
```

현재 title과 content라는 데이터 베이스가 있는 경우,

```javascript
from django import forms
from .models import Article
# 위 models.py에서 Article 모델을 참조하도록 설정한다.

class ArticleForm(forms.ModelForm):
  class Meta:
    model = Article
    fields = ['title', 'content'] # 사용할 모델의 필드 지정
    # 모든 필드를 사용하고 싶다면
    # fields = "__all__"
```

이렇게 하면 모델폼을 정의하고 사용할 수 있다.

그럼 다시 html에서 아래와 같이 간단하게 사용할 수 있다.

```javascript
# html에서 모델폼 사용

<form action="" method="">
  {{ form.as_p }}
</form>
```

그리고 해당 내용을 전송받는 view에서도 title과 content를 받아 새로운 article을 생성하는 번거로움 없이 아래 코드처럼 작성할 수 있다.

```javascript
# view.py 에서

def create(request):
  form = ArticleForm(request.POST)
  if form.is_valid():
    article = form.save()
    return redirect('detail', article.pk)

# html form을 사용하는 경우 코드
# title = request.POST.get("title")
# content = request.POST.get("content")
# article = Article.objects.create(title=title, content=content)
# return redirect("detail", article.pk)

```

이처럼 모델폼을 사용하면 유효성 검사까지 간단하게 할 수 있다.

For the site tree, see the [root Markdown](https://slashpage.com/kyugntae-ai.md).
