CreateView에 추가 modelform을 추가하고 싶습니다. 우리는 누군가가 주문을 추가 한 다음 해당 주문에 항목을 추가 할 수있는 주문 주문 시스템 을 보유하고 있습니다. 일반적으로 누군가가 처음으로 시간 동안 주문을 추가하면 해당 주문에 항목을 추가하기를 원하므로 해당 모델을 단일 양식에 결합하고 초기 주문 항목에 을 처리하고 싶습니다. 양식이 유효하지 않을 때 문제가 발생합니다.클래스 기반 뷰에서 다중 ModelForm 사용하기
템플릿에 항목 양식을 추가하기 위해 get_context_data를 재정 의하여 했으므로 추가 양식을 처리하기 위해 게시물을 재정의했습니다. 그러나 양식이 유효하지 않은 경우 POST 데이터를 전달하는 원래 양식을 다시 렌더링해야합니다. POST 데이터의 유무에 관계없이 양식을 렌더링하기 위해 get_context_data를 대체하는 가장 좋은 방법은 무엇입니까? 이런 식으로해야합니까?
def get_context_data(self, **kwargs):
context = super(OrderAdd, self).get_context_data(**kwargs)
if self.request.method == 'POST':
item_form = ItemForm(self.request.POST, prefix='item')
else:
item_form = ItemForm(prefix='item')
context['item_form'] = item_form
return context
내 CreateView는 현재 현재 멈춰있는 형태입니다.
class OrderAdd(CreateView):
model = Order
form_class = OrderForm
context_object_name = 'object'
template_name = 'form.html'
def get_context_data(self, **kwargs):
context = super(OrderAdd, self).get_context_data(**kwargs)
item_form = ItemForm(prefix='item')
context['item_form'] = item_form
return context
def post(self, request, *args, **kwargs):
order_form = OrderForm(request.POST)
item_form = ItemForm(request.POST, prefix='item')
if order_form.is_valid() and item_form.is_valid():
return self.form_valid(order_form)
else:
context = self.get_context_data()
return render(self.request, 'form.html', context)
귀하의 제안'get_context_data'은 당신이 가진 것을 제외하고, 바로 내 보이는 당신의/다른 절을 반대로 연결하면 - 당신에게 요청이 POST가 아닌 경우에만 항목 양식을 바인딩하려고합니다. 흠. 그렇다면 그것을 두 번 만들고 무효화 된 복사본을 컨텍스트에 넣습니다. 나는'get_context_data'가 POST 요청에'item_form' 값을 삽입하지 않고'get_context_data()'를 호출 한 후에 직접 추가한다고 생각합니다. –
고마워, 피터. 그것은 내가 수정 한 복사/붙여 넣기 실수였습니다. "대신 get_context_data()를 호출 한 후 직접 추가 하시겠습니까?" – scoopseven
컨텍스트는 단지 사전이므로'get_context_data' 외부에서 컨텍스트에 추가하거나 컨텍스트로부터 읽을 수 있습니다. 내가 처음 염두에 두었던 것을 위해 내가 추가 한 대답을 보아라. 그러면 내가 생각하는 것은 약간 더 우아한 접근법이다. –