# ModelForm이란? = Form + Model
Model과 연결된 Form을 자동으로 생성해주는 기능
Form과 ModelForm의 차이
- Form: 추가적인 내용을 입력 받을꺼다/ 사용자 입력 데이터를 DB에 저장하지 않음 (로그인)
- ModelForm: 정의한 필드를 입력받을꺼다 / 사용자 입력 데이터를 DB에 저장함 (게시글, 회원가입)
https://memezz.tistory.com/24을 ModelForm으로 바꿔보자
1. forms.py를 만든 후, ArticleForm을 생성해준다.
# articles/forms.py
from django import forms
from .models import Article
class ArticleForm(forms.ModelForm):
class Meta:
model = Article
fields = '__all__'
여기서 Meta는 뭐지..?
# Meta class
ModelForm의 정보를 작성하는 곳
- 'fields' 속성: 포함할 필드 지정
- 'exclude'속성: 제외할 필드 설정
class Meta:
model = Article
# 전체 출력
fields = '__all__'
# title만 출력
fields = ('title',)
# title만 제외
exclude = ('title',)
2. views.py에 ModelForm을 적용해준다.
def create(request):
form = ArticleForm(request.POST)
# 유효성 검사
if form.is_valid():
# 유효성 검사 통과라면
article = form.save()
return redirect('articles:detail', article.pk)
context = {
'form' : form,
}
return render(request, 'articles/new.html', context)
→ 이렇게 하면 input에 공백이 들어가는 등의 에러를 에러 메세지로 확인할 수 있다(유효성 검사)
더보기
is_valid()함수: 여러 유효성 검사를 실행하고, 데이터가 유효한지 여부를 Boolean으로 반환해줌
우리가 굳이 유효성 검사를 일일히 할 필요 없이 Django에서 알아서 해줌!
3. edit와 create도 바꿔준다.
# views.py
def edit(request, pk):
article = Article.objects.get(pk=pk)
form = ArticleForm(instance=article)
context = {
'article': article,
'form' : form,
}
return render(request, 'articles/edit.html', context)
def update(request, pk):
article = Article.objects.get(pk=pk)
form = ArticleForm(request.POST, instance=article)
if form.is_valid:
form.save()
return redirect('article:detail',article.pk)
context = {
'form' : form
}
return render(request,'article/edit.html',context)
<!-- articles/edit.html -->
<h1>Edit</h1>
<form action="{% url "articles:update" article.pk %}" method="POST">
{% csrf_token %}
{{form.as_p}}
<input type="submit">
</form>
- save() 함수: 데이터 베이스 객체를 만들고, 저장하는 함수
# save가 생성과 수정을 구분하는 방법
# CREATE일 때
form = ArticleForm(request.POST)
form.save()
# UPDATE일 때
form = ArticleForm(request.POST, instance=article) # 키워드인자 instance로 결정됨
form.save'BackEnd > Django' 카테고리의 다른 글
| [Django] Static Files & Media Files (0) | 2023.10.04 |
|---|---|
| [Django] view 함수 update (0) | 2023.10.04 |
| [Django] Form (0) | 2023.09.27 |
| [Django] HTTP request methods (1) | 2023.09.26 |
| [Django] 게시판 만들기 - 수정 (0) | 2023.09.26 |