# board/forms.py
from django import forms
from django.core.exceptions import ValidationError
from .models import Post
class PostForm(forms.ModelForm):
class Meta:
model = Post
fields = [ 'title', 'author', 'content', 'password' ]
widgets = {
'password': forms.PasswordInput,
}
def clean_password(self):
password = self.cleaned_data['password']
if self.instance.pk: # on Update
if password != self.instance.password:
raise ValidationError("Wrong password.", code='wrong_password')
return password
clean_<fieldname>()
함수가 호출됨을 이용.django.core.exceptions.ValidationError
를 raiseclean_<fieldname>()
에는 parameter가 없어서, self.cleaned_data
를 사용해서 입력된 폼의 값을 알아내야 함.self.instance
를 통해 현재 Form이 다루고 있는 Model에 접근할 수 있음
form_valid()
호출 전까지는 self.instance.save()
되지 않기 때문에,
PostCreateView와 연결된 self.instance
의 pk
는 None,
PostUpdateView와 연결된 self.instance
의 password
는 Update되지 않음/# board/views.py
from django.views.generic.edit import CreateView, UpdateView
from django.urls import reverse
from .models import Post
from .forms import PostForm
class PostUpdateView(UpdateView):
model = Post
form_class = PostForm
def get_success_url(self):
return reverse('post_detail', args=[self.object.pk])