簡體   English   中英

使用django modelform保存多個m2m字段時出錯

[英]Error in saving multiple m2m field with django modelform

我有一個名為Project的模型包含三個ManyToManyFieldmember_studentsupervisortag )。 其中一個( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM