기록하는 개발자

[Django] Form 본문

Web/Django

[Django] Form

밍맹030 2021. 5. 27. 18:02
728x90

기존 : html 파일에서 form 태그 안에 input태그를 넣어 데이터 베이스 형식에 맞게 사용했다.
수정 : forms.py를 통해 객체 지향적으로 관리할 수 있다.

 

forms.py의 장점

- 데이터 베이스의 model이 수정 될 때마다 views.py이나 html 파일들을 하나하나 바꾸지 않아도 된다.
- method를 이용해 데이터 유효성 검사가 가능하다.

ex)
<forms.py>

from django import forms
from .models import Blog

class BlogForm(forms.ModelForm) :
    class Meta : #일종의 이름표 역할 : blog모델의 fields 들을 가지고 blog form을 만들어주겠다.
        model = Blog
        fields = ['title', 'writer', 'body', 'image']



<views.py>

from django.shortcuts import render, redirect,get_object_or_404
from django.utils import timezone
from .models import Blog
import .forms import BlogForm #추가 된 import문

def new(request):
    form = BlogForm() #추가 된 코드
    return render(request, 'new.html', {'form' : form})


<new.html>
- 기존 form 태그 안에 내용 삭제 후 {% csrt_token %} 아래 { { form } } 써주기
-  { { form.as_p } }  :  p태그로 감싸진 상태의 태그가 보여진다

<form action="{%url 'create'%}" method="post">
            {%csrf_token%}
            { { form.as_p } }
            <button type="submit">submit</button>
</form>


<유효성 검사>
- new.html의 <form action={%url 'create'%} method="post" enctype="multipart/form-data">에서
views.py 의 create 함수가 호출되는데 이 create 함수에서 유효성 검사를 실행한다.

#기존 코드
def create(request):
    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.save()
    return redirect('detail', new_blog.id)

#수정 된 코드
def create(request) : 
   form = BlogFom(request.Post, request.FILES)
   if form.is_valid() :
      #pub_date가 빠진 상태이므로 이를 무시하고 new_blog에 임시저장
      new_blog = form.save(commit=False) 
      #new_blog의 pub_date를 timezone을 이용해 지정
      new_blog.pub_date = timezone.now()
      new_blog.save()
      return redirect('detail', new_blog.id)
   return redirect('home')
728x90

'Web > Django' 카테고리의 다른 글

[Django] 사용자 확장  (0) 2021.06.02
[Django] 로그인 및 회원가입 구현  (0) 2021.06.02
[Django] media  (0) 2021.05.27
[Django] static  (0) 2021.05.27
[Django] Template 상속  (0) 2021.05.27