본문 바로가기
Frameworks/Django

[Django] form입력 받는 세가지 방법

by 젊은오리 2022. 5. 12.
728x90

이전에 했던 프로젝트에서는 장고에서 form을 사용할 때 html파일에서 <form>태그를 이용해서 작성했다. codelion강의를 듣다가 훨씬 더 편리한 방법이 있다는걸 깨닫고.. 

까먹지 말자는 차원에서 다시 정리하는 글이다.

우선 모델은 다음과 같이 title, body, date속성을 갖는 Blog모델을 하나 정의했다.

1
2
3
4
5
6
7
8
9
10
11
# models.py
 
from django.db import models
 
class Blog(models.Model):
    title = models.CharField(max_length=200)
    body = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
 
    def __str__(self):
        return self.title
cs

 

1. HTML Form

첫번째 방법인 html form은 우리가 따로 파일을 만들 필요없이 그냥 html파일에다가 <form>태그를 사용해서 커스텀해주면 된다. 이 경우는 다음과 같이 request.POST['~~']로 form의 input값을 받아서 처리한다. 

1
2
3
4
5
6
7
8
9
10
# veiws.py
# html form을 이용해서 입력값을 받는 함수
def create(request):
    if(request.method == 'POST'):
        post = Blog()
        post.title = request.POST['title']
        post.body = request.POST['body']
        post.date = timezone.now()
        post.save()
    return redirect('home')
cs

 

 

2. Django Form

장고 폼을 만들어주기 위해서 models.py와 같은 위치상에 forms.py를 따로 만들었다. (forms.py에는 장고의 forms모듈을 사용하기 위해 import해줘야 한다). 우리가 만든 모델속성들을 이곳에 재정의해준다.

1
2
3
4
5
6
7
# forms.py
 
from django import forms
 
class BlogForm(forms.Form):
    title = forms.CharField()
    body = forms.CharField(widget=forms.Textarea)
cs

 

views.py에서 forms에 있는 BlogForm클래스를 import해주고 formcreate함수를 다음과 같이 정의한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# views.py
# django form을 이용해서 입력값을 받는 함수

from .forms import BlogForm
 
def formcreate(request):
    # 입력된 데이터 저장
    if request.method == 'POST':
        form = BlogForm(request.POST)
        # 유효성 검사
        if form.is_valid():
            post = Blog()
            post.title = form.cleaned_data['title']
            post.body = form.cleaned_data['body']
            post.save()
            return redirect('home')
    else:
        form = BlogForm()
    return render(request, 'form_create.html', {'form':form})
cs

 

3. Django ModelForm

마지막으로 모델폼을 사용한 방법이다. Django Form과 같은 방식으로 models.py와 같은 위치의 forms2.py파일을 만들어서 Django의 forms와 우리가 만든 models.py의 Blog모델을 불러온다. 

fields = '__all__'와 같이 Blog모델의 모든 속성을 가져올 수 있고, fields = ['title','body']와 같이 갖고 오고 싶은 속성을 선택해서 가져올 수 있다. 

1
2
3
4
5
6
7
8
9
10
# forms2.py
 
from django import forms
from .models import Blog
 
class BlogModelForm(forms.ModelForm):
    class Meta:
        model = Blog
        # fields = '__all__'
        fields = ['title''body']
cs

 

이제 views.py로 가서 함수를 작성해준다. 간단하게 코드를 설명하면 다음과 같다.

  • 요청방법이 POST일 경우에는 BlogModelForm 모델을 form객체로 받아서 유효성 검사를 한후에, DB에 저장한다.
  • 요청방법이 POST가 아닐경우에는 (ex : GET) 비어있는 BlogModelForm을 반환해준다.

이 방법은 Django form방법과 다르게 새로 form객체를 정의하고 모델속성을 일일이 집어넣을 필요 없이 자체적으로 save()기능이 있기 때문에 보다 효율적인 객체저장이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
# views.py
# Django ModelForm으로 입력받는 방법

from .forms2 import BlogModelForm
 
def modelformcreate(request):
    if request.method == 'POST':
        form = BlogModelForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = BlogModelForm()
    return render(request, 'form_create.html', {'form':form})
cs
728x90

댓글