안녕하세요~ 이번포스팅에서는 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시켜 준 후에 따로 사용해도 됩니다.
'Old Branch' 카테고리의 다른 글
Django - tweetme 소셜서비스 구현해보기 (14) - Update & Delete Tweet View (수정 삭제 구현) (0) | 2019.10.31 |
---|---|
Django - tweetme 소셜서비스 구현해보기 (13) - Create Tweet View (0) | 2019.10.30 |
Django - tweetme 소셜서비스 구현해보기 (11) - Dynamic URL Routing (0) | 2019.10.28 |
[tip] Django 디버깅하기 - django-debug-toolbar (0) | 2019.10.25 |
Django - tweetme 소셜서비스 구현해보기 (10) - Class based View (0) | 2019.10.24 |