save()得到了一个意外的关键字参数' commit' Django错误

时间:2015-03-18 19:36:04

标签: python django

发现此错误" save()得到了一个意外的关键字参数' commit'" 我试图做的是在用户上传文件时请求用户。

更新我添加了我的model.py和forms.py以及错误的屏幕截图对不起我的fisrt时间学习python / django。

screen shot

model.py

class Document(models.Model):
    fs = FileSystemStorage(location=settings.MEDIA_ROOT)
    input_file  = models.FileField(max_length=255, upload_to='uploads', storage=fs)
    user = models.ForeignKey(User)

    def __unicode__(self):
        return self.input_file.name

    @models.permalink
    def get_absolute_url(self):
        return ('upload-delete', )

forms.py

class BaseForm(FileFormMixin, django_bootstrap3_form.BootstrapForm):
    title = django_bootstrap3_form.CharField()



class MultipleFileExampleForm(BaseForm):
    input_file = MultipleUploadedFileField()

    def save(self):
        for f in self.cleaned_data['input_file']:
            Document.objects.create(
                input_file=f
            )

这是我的views.py

@login_required
def list(request):
    # Handle file upload
    if request.method == 'POST':
        form = MultipleFileExampleForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = form.save(commit=False)
            newdoc.user = request.user
            newdoc.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('myfiles.views.list'))
    else:
        form = MultipleFileExampleForm() # A empty, unbound form

    documents = Document.objects.all

    return render_to_response(
        'example_form.html',
        {'documents': documents, 'form': form},
        context_instance=RequestContext(request)
    )

2 个答案:

答案 0 :(得分:3)

你没有对 django.forms.ModelForm 进行子类化,但是,你正在编写你的代码。

你需要继承ModelForm(它的save方法带有commit参数)。

调用super也不会工作,因为超类没有带该参数的save方法。

删除 commit = False 除非您将代码重写为子类 django.forms.ModelForm

,否则它将无法工作

在任何情况下,save方法都应该始终返回一个实例。我建议您将方法重命名为 save_all_files 或类似的东西。您将无法使用 commit = False 在save方法中保存多个对象。这不是预期用途。

如需进一步阅读,您可以在以下地址阅读来源,了解提交=错误如何在 ModelForm类中运行:

https://github.com/django/django/blob/master/django/forms/models.py

答案 1 :(得分:0)

我相信你完全覆盖了save方法,它取消了现有的功能(即提交arg)。尝试在最后运行super(),以便它也具有现有的保存功能。

def save(self):
    for f in self.cleaned_data['input_file']:
        Document.objects.create(
            input_file=f
        )
    super(MultipleFileExampleForm, self).save(*args, **kwargs)