我有一个名为Project
的模型,包含三个ManyToManyField
(member_student
,supervisor
和{tag
)被排除在表单中,必须手动保存。因此,在视图中,我使用save(commit=False)
,因为我必须更改表单的一些字段。更改字段后,表单被保存,我逐个添加标记。然后,当我调用save_m2m
来保存ManyToManyField
时,我得到视图中save_m2m
行给出的错误:
invalid literal for int() with base 10: 'a'
这是我的模型。在
^{pr2}$这是forms.py
:
class ProjectForm(forms.ModelForm):
class Meta:
model = Project
exclude = ['owner_student', 'slug', 'tag']
tag = forms.CharField(max_length=100)
这是景色。在
def add_project(request):
parameters = {}
if request.method =="POST":
upload_form = ProjectForm(request.POST, request.FILES)
if upload_form.is_valid():
new_form = upload_form.save(commit=False)
mystud = Student.objects.get(user=request.user)
new_form.owner_student = mystud
new_form.save()
tags = upload_form.cleaned_data['tag']
tags = tags.split(',')
for eachtag in tags:
tag, created = Tag.objects.get_or_create(name=eachtag.strip())
tag.save()
new_form.tag.add(tag)
upload_form.save_m2m()
return HttpResponseRedirect(reverse(project_page, args=(new_form.slug,)))
else:
parameters["upload_form"] = upload_form
return render_to_response('upload.html', parameters)
else:
upload_form = ProjectForm()
parameters["upload_form"] = upload_form
parameters["page_title"] = "Upload your Project"
return render_to_response('upload.html', parameters)
所以,我的问题是如何保存标记以及另外两个ManyToManyField
而不会出错?我猜save_m2m
函数出错是因为get_or_create
返回的元组。在
不要在表单上使用“tag”作为charfield的名称。这将导致
save_m2m
认为需要使用charfield中的值来设置对象上的相关“tag”字段。在在内部,
save_m2m
遍历模型中的每个多对多字段。它检查表单的cleaned_data
字典中是否存在该名称下的数据,如果存在模型字段对象更新,则使用字段的save_form_data
方法记录内容。它相信表单字段返回了正确类型的Python对象。在本例中,charfield返回了一个字符串(如预期),但是将字符串分配给多对多字段是不正确的。在相关问题 更多 >
编程相关推荐