代码之家  ›  专栏  ›  技术社区  ›  HenryM

将modelChoiceFields合并为djano形式以保存在单个manytomanyField中

  •  1
  • HenryM  · 技术社区  · 6 年前

    我有一个 ModelForm 我想把一系列 ModelChoiceFields 当我保存到数据库时,进入一个多人字段。

    所以我的模型是这样的:

    class ExampleForm(forms.ModelForm):
        fulltime = forms.ModelChoiceField(
            queryset = Type.objects.filter(tag_type=jb_models.F_PTIME),
        )
        optional = forms.ModelChoiceField(
            queryset = Type.objects.filter(tag_type=jb_models.OPTIONAL),
        )
        class Meta:
            model = Job
            fields = ('jobtype', 'title', \
                'fulltime','optional')
            widgets = {
                'jobtype': forms.HiddenInput(),
                'title': forms.TextInput(attrs={'size':50}),
            }
    
        def save(self, commit=True):
            instance = super().save(commit=False)
            instance.jobtype.set(self.cleaned_data['fulltime'])
            instance.jobtype.add(self.cleaned_data['optional'])
            instance.save()
            return instance
    

    这给了我typeerror对象是不可iterable的。我该如何处理?

    1 回复  |  直到 6 年前
        1
  •  1
  •   neverwalkaloner    6 年前

    论证 set() 方法应该是对象列表,因此可以用 [] 以下内容:

    def save(self, commit=True):
        instance = super().save()
        instance.jobtype.set([self.cleaned_data['fulltime']])
        instance.jobtype.add(self.cleaned_data['optional'])
        return instance
    

    还请注意,您应该保存 instance 在设置之前,它是多个关系,否则您将得到错误:

    valueerror:“job”实例需要有主键值 在一个多对多的关系可以被使用之前。

    检查这个 docs 是的。