【发布时间】:2017-06-24 13:47:17
【问题描述】:
我希望能够保存 m2m 字段,但我遇到了一个问题,我遇到了这个错误:
ValueError: : "..." 需要有一个字段 "id" 的值才能使用这种多对多关系。
这是我的 models.py:
class Font(models.Model):
name = models.CharField(max_length=255)
...
class UserInfo(models.Model):
organisation = models.CharField(max_length=255)
font = models.ManyToManyField(Font)
...
我将 modelForm 用于多对多领域。我用 ajax 得到了我的价值观,这是(pdb) request.POST 上的样子:
<QueryDict: {'fonts': ['2', '5', '6'], 'organisation': ['COMPANY'], 'csrfmiddlewaretoken': ['...']}>
'fonts' 中的内容是Font 的 id。
views.py
...
save_it = form.save(commit=False)
save_it.organisation = request.POST.get('organisation')
for font in request.POST.getlist('fonts'):
fonts = Font.objects.filter(id=font)
save_it.font = fonts.first().id #error on save_it.font
save_it.save()
save_it.save_m2m()
...
forms.py
class UserInfoForm(forms.ModelForm):
class Meta:
model = UserInfo
fields = ['organisation', 'fonts']
我做错了什么?
【问题讨论】:
-
简单地执行 form.save() 会出现什么问题?你能用回溯显示错误吗?还是没有错误,但也没有创建关系?
-
@Melvyn 它保存除了 m2m 字段之外的所有内容,没有关系。错误出现在 save_m2m()
-
表单的“字体”字段生成什么?它会生成表单集吗?如果是这样,您的 ajax 不会传输它是 management form。
-
@Melvyn 表单 m2m 字段采用这种格式,
'fonts': ['2', '5', '6']这就是为什么我使用commit=False能够获取每个对象的id和save()它们。
标签: python django django-views