首页 > 解决方案 > Django模型形式:m2m的反面不保存

问题描述

从 Django 1.8 (python 2.7) 升级到 Django 2.0 (python 3.6) 后,此表单和反向 m2m 小部件出现错误:

models.py
class Treatment(Model):
  ...

class Specialty(Model):
  treatment = models.ManyToManyField(Treatment, related_name='specialties', blank=True)
  ...

. 这是治疗模型的表格。它还允许编辑专业(反向 m2m)。在升级之前它运行良好。

forms.py
class TreatDetail(forms.ModelForm):
    specialties = forms.ModelMultipleChoiceField(
        queryset=Specialty.objects.all().order_by('specialty_de'),
        required=False,
        widget=FilteredSelectMultiple('Specialties', False),

    )


    def save(self, commit=True):
        treatment = super(TreatDetail, self).save(commit=False)

        if commit:
            treatment.save()

        if treatment.pk:
            treatment.specialties = self.cleaned_data['specialties']
            self.save_m2m()

        return treatment

    def __init__(self, *args, **kwargs):
        super(TreatDetail, self).__init__(*args, **kwargs)
        if self.instance and self.instance.pk:
            self.fields['specialties'].initial = self.instance.specialties.all()

    class Meta:
        model = Treatment
        fields = (
            'top_treatment',
            'treatment_de',
            ....)

我得到这个错误:

/customadmin/treatdetail/2/de/ 处的 TypeError 禁止直接分配到多对多集合的反面。请改用 specialties.set()。

treatment.specialties = self.cleaned_data['specialties']

当然我试过:

treatment.specialties.set = self.cleaned_data['specialties']

错误消失,但未保存反向 m2m 关系。

有人可以帮忙吗?

标签: djangodjango-formsdjango-orm

解决方案


你做错了。您必须像这样M2M在 Django 2.0中将项目添加到关系中: 如果是一个专业列表- 您必须遍历它们并以相同的方式一个接一个地添加到您的.

treatment.specialties.add(self.cleaned_data['specialties'])

self.cleaned_data['specialties']treatment.specialties


推荐阅读