【问题标题】:Django UpdateView form with multiplechoicefield going to form in_valid when posted without selecting the multiple choice field?带有多项选择字段的 Django UpdateView 表单在未选择多项选择字段的情况下发布时会形成 in_valid 吗?
【发布时间】: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


    【解决方案1】:

    这能解决您的问题吗?

    self.fields['m2m_field'] = forms.MultipleChoiceField(choices = choices, 
                                   widget = FilteredSelectMultiple("M2M", False, choices = choices), 
                                   required=False)
    

    【讨论】:

      猜你喜欢
      • 2011-02-13
      • 2018-05-06
      • 2018-12-27
      • 2017-12-24
      • 2011-09-22
      • 2010-11-19
      • 2021-05-20
      • 1970-01-01
      • 2018-05-06
      相关资源
      最近更新 更多