이전에 했던 프로젝트에서는 장고에서 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 |
'Frameworks > Django' 카테고리의 다른 글
[Django] ~ 장고프로젝트 앱 생성까지 진행 (0) | 2022.05.30 |
---|---|
[Django] settings.py에서 SECRET KEY 관리하기 (0) | 2022.05.18 |
[Django] static파일 관리하기 (0) | 2022.05.11 |
[Django] 크롤링한 데이터 DB에 저장하기 (0) | 2022.05.04 |
댓글