장고에서 제공해주는 FORM ... form 태그의 form
: 입력 공간 → 폼태그 안에 인풋태그 넣음
⇒ 데이터 베이스 형식에 맞아야 함
... 장점? : 데이터베이스의 모델이 변할 때마다 하나하나 바꾸지 않아도 됨, 만들었던 html 로 데이터베이스가 받을 수 있게 적합한 정보인지 유효성 검사 편하게 가능
from django import forms
from .models import Blog
class BlogForm(forms.ModelForm):
class Meta:
model = Blog
fields = ['title', 'writer', 'body', 'image']
Python
복사
django 에서 forms 사용
model 에 맞는 데이터 형식의 폼 만들기 위해 Blog 를 import
BlogForm 이라는 클래스 만듦
forms 에서 ModelForm 을 상속 받음
클래스 안에 메타 클래스 만듦
메타 클래스 안 model 을 Blog 라 하고 fields 를 추가(models.py 에서 만들 폼을 제공하는 기능) ...
글이 작성된 시간을 자동으로 넣어주는 기능 pub_date 빼고 title, writer, body, image 를 추가
views.py 에서 from .forms import BlogForm 추가
def new 에서 다음과 같이 코드 변경
def new(request):
form = BlogForm()
return render(request, 'new.html', {'form':form})
Python
복사
new.html 에 있던
<p>제목: <input type="text" name="title"></p>
<p>작성자: <input type="text" name="writer"></p>
<p>사진: <input type="file" name="image"></p>
본문: <textarea name="body" id="" cols="30" rows="10"></textarea>
지우고
{{form.as_p}}
추가함 ... form 만 하면 정렬 안되니 .as_p 로 p 태그 정렬
<table>
{{form.as_table}}
</table>
로 만들어도 됨
폼태그에서 중요한 것은 폼 뿐만이 아니라 폼에서 create 로 보내는데, 요청을 받는 create 에서 어떤 유효성 검사를 하고 난 다음 데이터베이스에 저장하는 역할 ... BlogForm 이 다 해줌
new_blog = Blog()
new_blog.title = request.POST['title']
new_blog.writer = request.POST['writer']
new_blog.body = request.POST['body']
new_blog.pub_date = timezone.now()
new_blog.image = request.FILES['image']
new_blog.save()
→ 다음 코드 처럼 만듦
def create(request):
form = BlogForm(request.POST, request.FILES)
if form.is_valid():
new_blog = form.save(commit=False)
new_blog.pub_date = timezone.now()
new_blog.save()
return redirect('detail', new_blog.id)
return redirect('home')
Python
복사
BlogForm 생성 후 폼의 객체에 request.POST, request.FILES 같이 넣어줌
해당 폼이 유효한지 검사 후 유효할 경우 commit=False 로 임시 저장을 시킴
폼이 만약 model에 있는 field 를 다 담았으면 그냥 저장해도 되는데 pub_date 가 빠졌으므로
빠진 pub_date 를 넣어 column 을 마저 채우고 save 함
기존 return 은 유효할 때만 실행이 되게끔 if 안으로 넣어주고
유효하지 않을 경우 home 으로 redirect 하게 만듦