Meme's IT

[Django] ModelForm 본문

BackEnd/Django

[Django] ModelForm

Memez 2023. 10. 4. 14:04

# 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  (0) 2023.09.26
[Django] 게시판 만들기 - 수정  (0) 2023.09.26