Form을 통해 request에 있는 Parameter를 관리한다. Post와 함께 써서 Model에 데이터를 저장하는 용도로 사용하기 용이하다.
Question Model에 사용하기 위해 ModelForm을 상속해 다음과 같이 만들었다.
from django import forms
from pybo.models import Question
class QuestionForm(forms.ModelForm):
class Meta:
model = Question
fields = ['subject', 'content']
labels = {'subject': '제목', 'content': '내용'}
widget = {'subject': forms.Textarea(attrs={'class': 'form-control'}),
'content': forms.Textarea(attrs={'class': 'form-control', 'rows': 10)}
{{ form.as_p }}
를 사용해줬기에 작성했다. .as_table, .as_p는 자동으로 해당 form을 as 뒤의 class로 바꿔 html 코드로 작성해준다.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)
하나씩 살펴보면, question_list.html에서 질문등록하기 버튼을 누르면 href="{% url 'pybo:question_create' %}"
로 인해 views.question_create 함수로 연결된다.
Default 연결은 GET으로, form에 빈 QuestionForm이 들어간 상태로 rendering해 question_form.html을 보여준다. 즉 빈 입력창이다.
form에 입력값을 넣고 버튼을 누르면, question_form.html에 정의된 대로 POST method를 통해, default action으로 정의된 현 url로 form이 전송된다. 그러면 위의 if 안의 내용을 수행한다.
QuestionForm을 request.POST를 통해 전해진 내용들로 넣어준다. form의 subject와 content 내용이 저장되었을 것이다. form.save(commit=False)
는 아직 time을 설정하지 않았기 때문. 이것까지 설정하고 다시 index로 redirecting하는 흐름이다.
시험기간과 과제 기간과 여러 인턴 접수기간이 겹쳤다. 꾸준히 진도는 나가려고 하지만, 앞으로는 아마? Technical한 부분이 많을 것 같으니, 몇몇 포인트만 집어서 velog에 작성해야겠다.
상세하게는 그때 그때 주석으로 남겨두자 화이팅.