【发布时间】:2017-11-06 15:42:07
【问题描述】:
我的模型有一个更新视图,并且该模型与另一个模型具有多对多关系。由于一些过滤要求,我创建了一个自定义多项选择字段,并通过修改 form_valid 来保存它。但是,如果未选择此多项选择字段,则表单将发布到 form_invalid。此字段不是必需的。我的观点和形式如下:
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),
}
【问题讨论】:
标签: django django-forms