Leta Learns

[점프 투 장고] 2-10 질문 등록 기능 만들기 본문

Django

[점프 투 장고] 2-10 질문 등록 기능 만들기

leta 2021. 7. 3. 23:46

[4] pybo/forms.py에 장고 폼 작성하기

 

from django import forms
from pybo.models import Question

     class QuestionForm(forms.ModelForm):
          class Meta:
               model = Question
               fields = ['subject', 'content']

 

장고 폼 : forms.Form을 상속받는 폼, forms.ModelForm을 상속받는 모델 폼 (2가지로 구분 가능)

 

모델 폼 : 모델과 연결된 폼, 모델 폼 객체를 저장하면 연결된 모델의 데이터 저장 가능.

            장고 모델폼은 내부 클래스로 Meta 클래스를 반드시 가져야 함.

            Meta 클래스에는 모델 폼이 사용할 모델과 모델의 필드들을 적어야 한다.

              ex) QuestionForm 클래스는 Question 모델과 연결 (model = Question)

                                                  subject, content 필드를 사용 (fields = ['subject', 'content']

 

 

 

 

 

[7] 입력 데이터 저장하기 

[파일명: C:\projects\mysite\pybo\views.py]

def question_create(request):
    if request.method == 'POST':
        form = QuestionForm(request.POST)
        if form.is_valid():
            question = form.save(commit=False)
            question.create_date = timezone.now()
            question.save()
            return redirect('pybo:index')
    else:
        form = QuestionForm()
    context = {'form':form}
    return render(request, 'pybo/question_form.html', context)

 

1. 동일한 url 요청을 post, get 요청 방식에 따라 다르게 처리.

  • <질문 등록하기> 버튼을 누르면 /pybo/question/create/가 get 방식으로 요청 -> 질문 등록 화면
  • 입력값을 채운 후 <저장하기> 버튼을 누르면 /pybo/question/create/가 post 방식으로 요청 -> 데이터 저장 

2. QuestionForm 객체도 get, post 방식 다르게 생성.

  • get -> QuestionForm()
  • post -> QuestionForm(request.POST) (전달받은 데이터로 폼의 값이 채워지도록)

3. question = form.save(commit=False) 에서 commit=False는 임시 저장을 의미.

   폼으로 질문 데이터를 저장할 경우 Question 모델의 create_date에 값이 설정되지 않음 -> 오류 발생.

   현재 폼에는 subject, content 필드만 존재함. create_date 필드는 x

      -> 임시저장한 후 question 객체를 반환받아 create_date에 값을 설정하고 question.save()로 실제 저장.

 

 

 

 

 

 

 

 

 

참고 : wikidocs 점프 투 장고 https://wikidocs.net/70855

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

Comments