classProcessMultipleFormsView(ProcessFormView): """ A mixin that processes multiple forms on POST. Every form must be valid. """ defget(self, request, *args, **kwargs): form_classes = self.get_form_classes() forms = self.get_forms(form_classes) return self.render_to_response(self.get_context_data(forms=forms))
if form.is_valid(): #2 return self.form_valid(form) else: #3 return self.render_to_response (self.get_context_data(forms=forms))
#1 : form_classes에서 key 값이 ‘ReviewForm’인 것의 value를 ReviewForm 객체이다. 만약 request.POST을 통해 전달된 form이 ReviewForm이라면 form_class 변수에 ReviewForm 객체를 담고, 그렇지 않으면 RestaurantForm 객체를 담는다.
#2 : form 변수에 담긴 form이 유효한지 확인하고, 유효하다면 MultipleFormsMixin에 담긴 form_valid를 실행.
#3 : 유효하지 않다면, form에 담긴 데이터를 그대로 다시 돌려주고, 현재 페이지에 다시 리다이렉트 된다.
from django.shortcuts import render, render_to_response from django.views.generic import CreateView
from django.utils.decorators import method_decorator from django.contrib.auth import views, models, login, decorators from django.contrib.auth.decorators import login_required
from .models import Restaurant, Review from .forms import ReviewForm, RestaurantForm
{% for field in forms.ReviewForm %} <divclass="form-group row "> <labelfor="colFormLabel"class="col-sm-2 col-form-label">{{ field.label_tag }}</label> {# error message 출력 #} <divclass="col-sm-10 "> {{ field }} {% if field.errors %} {% for e in field.errors %} <pstyle="color:palevioletred;">{{ e | escape }}</p> {% endfor %} {% endif %}
#1 : form class의 collapse show multi-collapse는 부트스트랩에 내장된 클래스이다. multi-collapse는 여러 개의 elements에 속한다는 것을 알려주는 크래스. show는 element를 보여주는 클래스이다. #2의 버튼에 있는 collapse cotrol에 따라 없어지고, 나타난다.
#2 : data-target=".multi-collapse" aria-controls="ReviewForm RestaurantForm" data-target을 통해 .multi-collapse 클래스를 가진 엘리먼트를 동시에 컨트롤한다. aria-controls는 id 속성 값이 ReviewForm, RestaurantForm인 엘리먼트를 컨트롤한다.
#3 : 토글 버튼을 누르면 ReviewForm이 사라지고, RestaurantForm이 나타난다.