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),
}