Old Branch

Django - tweetme 소셜서비스 구현해보기 (12) - Model Form & Validation

woolbro 2019. 10. 29. 00:48
반응형

안녕하세요~ 이번포스팅에서는 Model Form 과 Validation에 대해 알아보도록 하겠습니다.

 

기본적인 Validation을 사용 하려고 합니다. 입력 폼 모델을 수정 할 수 있게 하고, 입력된 값에 대해 저장 시에 Validation 할 수 있는 기능을 작성 해 보려고 합니다.

 

본 포스팅의 모든 소스코드는 Github 에 업로드 되어있습니다.

 


Tweet앱을 작성하는데, admin에서 tweet을 관리하는 화면을 보면, 아래와 같이 User, Content 를 수정하는 화면이 있습니다.

아래의 Content는 Tweet을 작성 할 것이기 때문에 적절한 Validation 이 필요합니다.

 

 

Model 에 Validation을 추가 해 주기 위해 form을 설정하는 파일을 작성 해 주도록 하겠습니다.

 

 

1. form 작성하기

tweet앱에 적용 할 form이기 때문에 tweet파일에 아래의 forms.py을 작성 해 주겠습니다.

from django import forms

from .models import Tweet

class TweetModelForm(forms.ModelForm):
    class Meta:
        model = Tweet
        fields = [
            "user",
            "content"
        ]

Tweet 모델 안에 있는 field는, "user","content" 라는 뜻이 됩니다.

 

2. admin 적용

위의 forms.py를 작성했으니 admin페이지에 적용 시켜주기 위해 admin.py에 import 해 주도록 하겠습니다.

tweet의 admin.py 입니다.

from django.contrib import admin

# Register your models here.
from .models import Tweet
from .forms import TweetModelForm


#admin.site.register(Tweet)

class TweetModelAdmin(admin.ModelAdmin):
    form = TweetModelForm
        

admin.site.register(Tweet,TweetModelAdmin)

 

이제 서버를 시작해서 확인 해 보면, Tweet페이지가 잘 나오는 것을 확인 할 수 있습니다.

작성한 forms.py의 field를 수정 해 주면, 위의 화면 또한 같이 수정되게 됩니다.

 

forms.py의 field에 있는 user를 주석처리 한 후에 서버를 실행시키면

from django import forms

from .models import Tweet

class TweetModelForm(forms.ModelForm):
    class Meta:
        model = Tweet
        fields = [
           # "user",
            "content"
        ]

 

위와같이 출력되는 것을 볼 수 있습니다.

 

 

3. forms.py에 Validation 추가하기

content에 작성 될 단어를 Validation 해 주도록 하겠습니다. '바보' 라는 단어를 작성하지 못하게 설정을 해 주려고 합니다. 

본문에서 작성한 forms.py를 아래와 같이 수정 해 주세요

from django import forms

from .models import Tweet

class TweetModelForm(forms.ModelForm):
    class Meta:
        model = Tweet
        fields = [
            "user",
            "content"
        ]

    def clean_content(self, *args, **kwargs):
        content = self.cleaned_data.get("content")
        if content == "바보":
            raise forms.ValidationError("저장 할 수 없는 단어  <" + content +" >  입니다.")
        return content

 

이제 서버를 실행 한 후 content에 '바보' 단어를 작성 해 보겠습니다

 

코드에서 작성 한 대로, "작성할 수 없는 단어 ~~ 입니다" 가 Validation Error 로 출력되는 것을 볼 수 있습니다.

 

이 Validation은, 작성한 forms.py에 추가하여 설정 할 수도 있지만, 모델에서 작성 할 수도 있습니다.

 

 

4. Validation - 모델에 직접 작성하기

위의 Validation 방법은 forms.py를 작성하고 따로 만들어 준 방법인데요

위의 방법 외에도, 작성한 model 에 바로 Validation을 적용 해 줄 수 있습니다.

 

이전에 작성했었던 forms.pyd의 Validation 부분을 주석처리 해 줍니다.

from django import forms

from .models import Tweet

class TweetModelForm(forms.ModelForm):
    class Meta:
        model = Tweet
        fields = [
            "user",
            "content"
        ]

    # def clean_content(self, *args, **kwargs):
    #     content = self.cleaned_data.get("content")
    #     if content == "바보":
    #         raise forms.ValidationError("저장 할 수 없는 단어  <" + content +" >  입니다.")
    #     return content

 

이제 tweet앱의 model로 돌아와, 위와 비슷한 Validation을 작성 하겠습니다.

models.py를 아래와 같이 수정 해 주세요

from django.db import models
from django.core.exceptions import ValidationError
from django.conf import settings

# Create your models here.

class Tweet(models.Model):
    
    user        = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE)
    content     = models.CharField(max_length=140)
    timestamp   = models.DateTimeField(auto_now =True)
    updated     = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return str(self.content)

    def clean(self,*args,**kwargs):
        content = self.content
        if content == "바보":
            raise ValidationError("저장 할 수 없는 단어  <" + content +" >  입니다.")
        return super(Tweet,self).clean(*args,**kwargs)

 

비슷한 코드가 forms.py에서 models.py로 옮겨왔습니다. 동작화면은 동일하게 '바보'라는 단어를 사용하지 못합니다.

차이점이라면, 저장할수 없는 단어의 알림 위치가 바뀌었습니다.

model에 작성 해 주었기 때문에 특정 form하나가 아니라  model의 요소 하나로 판단되기 때문입니다.

 

 

파일을 validator.py로 나누어 import시켜 준 후에 따로 사용해도 됩니다.