# TIL 웹개발 - Django의 cleaned_data 활용

모델 폼을을 사용해 값을 받은 후 그 값을 다시 반환하거나 사용할때 cleaned_data를 사용할 수 있다.
팀프로젝트에서 해시태그 기능을 만들때 cleaned_data를 사용해 중계테이블의 값을 가져왔다.

```javascript
#models.py

class Hashtag(modles.Model):
  content = models.TextField()

class Article(models.Model):
  title = models.CharField(max_lenth=100)
  content = models.TextField()
  hashtags = models.ManytomanyField(
    Hashtag, related_name="hashtag_articles"
  )
```

해시태그와 아티클의 모델을 만들고 아티클에 해시태그를 M:N 필드로 가져와 article_hashtag 중계테이블을 만든 상태다.

```javascript
#forms.py

class ArticleForm(forms.Form):
  hashtags = TextField()
  class Meta:
    model = Article
    fields = "__all__"
```

모델폼은 만드는데 hashtags를 상속받지 않고 오버라이딩한다.
이유는,  상속받아 폼에 적용하면 hashtag테이블에 생성된 것 중 선택하는 양식으로 나오기 때문이다.
보통 해시태그는 선택이 아니라 직접 작성하기 때문에 위 코드처럼 오버라이딩해서 Textfield로 지정한다.

```javascript
#views.py

def article_create(reqeuset):
  if reqeust.method == "POST":
    form = ArticleForm(data = requset.POST)
    if form.is_valid():
      form.save()
      return redirect("article_detail")
  else:
    form = ArticleForm()
  context = {'form':form}
  return render(requset, "article_create.html", context)
    
```

views.py 에서는 모델폼을 사용해 값을 입력받는 로직이다. 하지만 form이 만들어지고 save를 했다고 해도 article_hashtags 중계 테이블에는 데이터가 저장되지 않는다. 이때 form의 cleaned_data 요소를 사용해 hashtag값을 반환해 따로 저장한다.

form.is_valid()를 통해 유효성 검사를 통과화면 cleaned_data 딕셔너리가 생성되고 데이터가 cleaned_data 딕셔너리에 추가된다. 각 필드의 이름이 딕셔너리의 키(key)가 되고 입력한 내용이 값(value)로 저장된다.

만약 내가 아티클을 아래와 같이 작성하고,

- 타이틀: 아이폰 신상 공개

- 내용: 아이폰이 새로나왔어요!

- 해시태그: 아이폰

if form.is_valid()를 지나 해시태그 내용응 반환하고 다시 해시태그 테이블에서 그 값으로 중계테이블에 추가한다.

```javascript
#views.py cleaned_data 사용

def article_create(reqeuset):
  if reqeust.method == "POST":
    form = ArticleForm(data = requset.POST)
    if form.is_valid():
      form.save()
      hashtag_content = form.cleaned_data["hashtags"] #해시태그값
      hashtag = Hashtag.objects.get(content = hashtag_content) #해시테그테이블에서조회
      article.hashtags.add(hashtag.pk) #중계테이블추가
      return redirect("article_detail")
  else:
    form = ArticleForm()
  context = {'form':form}
  return render(requset, "article_create.html", context)
```

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