Model이 있고 사용자가 게시글을 제출할 수 있는 양식을 만들고 싶은 경우 이미 모델에서 필드를 정의 했기에 form에서 필드를 재정의 하는 중복된 행위를 방지 하기 위해 Django는 Model을 통해 Form Class를 만들 수 있는 Helper 제공
# 타이틀 필드 제외
class Meta :
model = Article
fields = '__all__'
exclude = ('title')
- 유효성 검사를 실행하고, 데이터가 유효한지 여부를 boolean으로 반환
- form에 바인딩 된 데이터에서 데이터베이스 객체를 만들고 저장
- ModelForm의 하위(sub)클래스는 기존 모델 인스턴스를 키워드 인자 instance로 받아 들일 수 있다.
- 이게 제공 되면 save()는 해당 인스턴스를 업데이트(update)
- 제공되지 않으면 save()는 지정된 모델의 새 인스턴스를 만듦(create)
- form의 유효성이 확인되지 않은경우 save()를 호출하면 form.errors를 확인하여 에러 확인 가능
def create(request):
if request.method == 'POST':
form = ArticleForm(request.POSt) # Query dict를 첫번째 인자로 받음 -> 데이터가 채워진 form이 만들어짐
# 유효성 검사
if form.is_valid():
article = form.save() # 새로 작성된 객체 article
# detail 페이지로 이동하기 위해 article객체를 생성한것이지 무조건 해야 되는건 아님. 만약 index 페이지로 redirect할꺼면 객체 생성 필요 없이 그냥 form.save()만 하면 된다.
return redirect('articles:detail', article.pk)
else:
# new
form = ArticleForm()
context = {
'form' : form,
}
return render(request, 'articles/new.html', context)
# 기존에 있는 데이터를 수정할 경우
def update(request,pk):
article = Article.objects.get(pk=pk)
if request.method == 'POST':
form = ArticleForm(request.POST, instance=article)
if form.is_valid():
form.save()
return redirect('articles:detail', article.pk)
else:
form = Article.Form(instance=article)
context = {
'form' : form,
}
return render(request, 'articles/update.html', context)
class ArticleForm(forms.ModelForm):
title = forms.CharField(
label = 'title',
widget = forms.TextInput(
attrs={
'class' : 'my-title',
'placeholder' : 'Enter the title',
}
),
)
class Meta:
model = Article:
fields = '__all__'