Django 模型形式:m2m 的反面不保存

Django model form: reverse side of m2m not saving

从 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',
            ....)

我收到这个错误:

TypeError at /customadmin/treatdetail/2/de/ Direct assignment to the reverse side of a many-to-many set is prohibited. Use specialties.set() instead.

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

我当然试过了:

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

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

有人可以帮忙吗?

你做错了。您必须将项目添加到 Django 2.0 中的 M2M 关系,例如 this:

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

如果 self.cleaned_data['specialties']specialties 的列表 - 您必须遍历它们并以相同的方式将它们一一添加到您的 treatment.specialties.