2013-05-07 2 views
1

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) 
+0

귀하의 제안'get_context_data'은 당신이 가진 것을 제외하고, 바로 내 보이는 당신의/다른 절을 반대로 연결하면 - 당신에게 요청이 POST가 아닌 경우에만 항목 양식을 바인딩하려고합니다. 흠. 그렇다면 그것을 두 번 만들고 무효화 된 복사본을 컨텍스트에 넣습니다. 나는'get_context_data'가 POST 요청에'item_form' 값을 삽입하지 않고'get_context_data()'를 호출 한 후에 직접 추가한다고 생각합니다. –

+0

고마워, 피터. 그것은 내가 수정 한 복사/붙여 넣기 실수였습니다. "대신 get_context_data()를 호출 한 후 직접 추가 하시겠습니까?" – scoopseven

+0

컨텍스트는 단지 사전이므로'get_context_data' 외부에서 컨텍스트에 추가하거나 컨텍스트로부터 읽을 수 있습니다. 내가 처음 염두에 두었던 것을 위해 내가 추가 한 대답을 보아라. 그러면 내가 생각하는 것은 약간 더 우아한 접근법이다. –

답변

2

한 약간 세련되지 못한 방법 :

def get_context_data(self, **kwargs): 
    context = super(OrderAdd, self).get_context_data(**kwargs) 
    if self.request.method == 'POST': 
     return context 
    else: 
     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() 
     context['item_form'] = item_form 
     return render(self.request, 'form.html', context) 

또 다른 대안 :

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 

def post(self, request, *args, **kwargs): 
    order_form = OrderForm(request.POST) 
    context = self.get_context_data() 
    item_form = context['item_form'] 

    if order_form.is_valid() and item_form.is_valid(): 
     return self.form_valid(order_form) 
    else: 
     return render(self.request, 'form.html', context) 
+0

"다른 대안"아이디어를 사용하여 완벽하게 작동했습니다. 감사. – scoopseven

관련 문제