2017-11-06 11 views
0

私は自分のモデルの更新ビューを持っていますが、このモデルは他のモデルと多少の関係にあります。私はカスタムのmultiplechoicefieldを作成し、form_validを変更して保存しています。しかし、この複数選択フィールドが選択されていない場合、フォームはform_invalidにポストされます。このフィールドは必須ではありません。私の見方と様子は次のようになります。複数選択欄を選択せず​​に投稿した場合、Django UpdateViewフォームと複数選択欄がin_validになりますか?

class Updatemodel(UpdateView): 
    template_name = ... 

    def get_success_url(self): 
     return .. 

    def get_from_class(self): 
     .. .. 

    def form_valid(self,form): 
     kwargs = super(Updatemodel, self).get_form_kwargs() 
     m2m_initial = kwargs['instance'].model_m2m.filter(..) 
     chosen_m2m = model_m2m.objects.filter(pk__in = form.cleaned_data.get('model_m2m')) 
     m2m_add = chosen_m2m.exclude(pk__in = m2m_initial.values_list('pk, flat = True)) 
     m2m_remove = m2m_initial.exclude(pk__in = chosen_m2m.values_list('pk,flat = True)) 
     form.instance.model_m2m.add(*m2m_add) 
     form.instance.model_m2m.remove(*m2m_remove) 

     return super(Updatemodel, self).form_valid(form) 

    def get_form_kwargs(self): 
     kwargs = super(Updatemodel, self).get_form_kwargs() 
     kwargs['m2m_initial'] = kwargs['instance'].model_m2m.filter(..) 
     kwargs['m2m'] = model_m2m.objects.all().filter(..) 

..................フォームを見ると.........。 ......

class m2m_update_form(forms.ModelForm): 
     def __init__(self, *args, **kwargs): 
      m2m = kwargs.pop('m2m',None) 
      m2m_initial = kwargs.pop('m2m_initial',None) 

      super(m2m_update_form, self).__init__(*args, **kwargs) 
      choices = [(M2M.pk, M2M.Name) for M2M in m2m ] 
      self.fields['m2m_field'] = forms.MultipleChoiceField(choices = choices, widget = FilteredSelectMultiple("M2M", False, choices = choices)) 
      self.initial['m2m_field'] = [M2M for M2M in m2m_initial] 

     class Media: 
      .. 

     class Meta: 
      model = model1 
      fields = ['field1', 'field2','field3'] 
      widgets = { 
      'field3' = FilteredSelectMultiple("Field", False), 
      } 

答えて

1

これで問題は解決しますか?

self.fields['m2m_field'] = forms.MultipleChoiceField(choices = choices, 
           widget = FilteredSelectMultiple("M2M", False, choices = choices), 
           required=False) 
関連する問題