Sign In
TIL 웹개발

TIL 웹개발 - Django의 cleaned_data 활용

서경태
모델 폼을을 사용해 값을 받은 후 그 값을 다시 반환하거나 사용할때 cleaned_data를 사용할 수 있다.
팀프로젝트에서 해시태그 기능을 만들때 cleaned_data를 사용해 중계테이블의 값을 가져왔다.
#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 중계테이블을 만든 상태다.
#forms.py class ArticleForm(forms.Form): hashtags = TextField() class Meta: model = Article fields = "__all__"
모델폼은 만드는데 hashtags를 상속받지 않고 오버라이딩한다.
이유는, 상속받아 폼에 적용하면 hashtag테이블에 생성된 것 중 선택하는 양식으로 나오기 때문이다.
보통 해시태그는 선택이 아니라 직접 작성하기 때문에 위 코드처럼 오버라이딩해서 Textfield로 지정한다.
#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()를 지나 해시태그 내용응 반환하고 다시 해시태그 테이블에서 그 값으로 중계테이블에 추가한다.
#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)
Subscribe to 'kyugntae-ai'
Subscribe to my site to be the first to receive notifications and emails about the latest updates, including new posts.
Join Slashpage and subscribe to 'kyugntae-ai'!
Subscribe
👍