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
.
从 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
.