2017-06-04 118 views
0

我很難處理特殊情況。有一個UpdateView,我用它來提供一個標準表格(專門爲ModelForm)和一個內聯表單。使用UpdateView和InlineFormSet時,Django ForeignKey對象不會保存

views.py代碼如下所示:

class Contract(LoginRequiredMixin, UpdateView): 
    template_name = '/path/to/template.html' 
    model = ContractModel 
    form_class = ContractModelForm 
    success_url = reverse_lazy('contract-list') 

    def get_context_data(self, **kwargs): 
     context = super(ContractVerificationUpdate, self).get_context_data(**kwargs) 
     if self.request.POST: 
      context['student_form'] = StudentsFormSet(self.request.POST) 
     else: 
      context['student_form'] = StudentsFormSet(instance=self.object) 
     return context 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     context = self.get_context_data() 
     student_form = context['student_form'] 
     if student_form.is_valid(): 
      self.object = form.save() 
      student_form.instance = self.object 
      student_form.save() 
      return HttpResponseRedirect(self.get_success_url()) 
     else: 
      return self.render_to_response(self.get_context_data(form=form)) 

當我打開這個更新視圖,學生的分配在本合同範本都顯示正常,但是當我編輯在他們的東西(比如我編輯學生的姓名),然後我點擊保存按鈕,它不會被保存。用我的調試器,我已經確認它到達student_form.save()這條線,它應該更新我猜的對象,儘管它不保存它自己。這有什麼問題?

這可能很容易解決,但我的思想真的被困在這一點!歡迎任何形式的幫助或建議!

預先感謝您!

回答

1

您需要先保存,才能致電form.is_valid()

編輯您的看法是這樣,

def form_valid(self, form): 
    self.object = form.save(commit=False) 
    context = self.get_context_data() 
    student_form = context['student_form'] 
    if form.is_valid() and student_form.is_valid(): 
     self.object = form.save() 
     student_form.instance = self.object 
     student_form.save() 
     return HttpResponseRedirect(self.get_success_url()) 
    else: 
     return self.render_to_response(self.get_context_data(form=form)) 
+0

你能不能也顯示這是有道理的模型和表單集 – zaidfazil

+0

,但我設法解決我的問題有另一種方法:在'get_context_data在POST請求的情況下( )'',我將'context_'student_form'] = StudentsFormSet(self.request.POST)'改爲這個'context ['student_form'] = StudentsFormSet(self.request.POST,instance = self.get_object())'和現在它工作正常。 –

相關問題