[英]Error in saving multiple m2m field with django modelform
我有一個名為Project
的模型包含三個ManyToManyField
( member_student
, supervisor
和tag
)。 其中一個( tag
)在表單中排除,必須手動保存。 所以,在視圖中,我使用save(commit=False)
因為我必須更改表單的某些字段。 更改字段后,表單將保存,我會逐個添加標簽。 然后,當我調用save_m2m
來保存ManyToManyField
,我得到視圖中save_m2m
行給出的錯誤:
invalid literal for int() with base 10: 'a'
這是我的模特。
class Tag(models.Model):
name = models.CharField(unique=True, max_length=60)
slug = models.SlugField(max_length=60, unique=True)
def save(self, *args, **kwargs):
if not self.id:
self.slug = slugify(self.name)
super(Tag, self).save(*args, **kwargs)
class Project(models.Model):
'''Main Project uploading'''
title = models.CharField(max_length=300)
description = models.TextField(null=True)
#year = models.ForeignKey(Year)
tag = models.ManyToManyField(Tag)
owner_student = models.ForeignKey(Student, related_name='member_student')
member_student = models.ManyToManyField(Student, blank=True, null=True)
supervisor = models.ManyToManyField(Supervisor, blank=True, null=True)
subject = models.ForeignKey(Subject)
main_document = models.FileField(upload_to='main_documents/')
supporting_document = models.FileField(upload_to='supp_documents/', blank=True, null=True)
source_code = models.FileField(upload_to='source_code/', blank=True, null=True)
screenshot = models.ImageField(upload_to='screenshots/', blank=True, null=True)
這是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'作為表單上字段的名稱。 這將導致save_m2m
認為它需要使用charfield中的值來設置對象上的相關“tag”字段。
在內部, save_m2m
遍歷模型中的每個多對多字段。 它在表單的cleaned_data
字典中檢查該名稱下是否存在數據,如果存在,則模型字段對象更新使用字段的save_form_data
方法記錄內容。 它信任表單字段以返回正確類型的Python對象。 在這種情況下,您的charfield返回一個字符串(如預期的那樣),但是將字符串分配給多對多字段是不正確的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.