文件上传使用modelform在Django中提供错误请求

时间:2013-12-31 14:18:56

标签: django file-upload django-forms

我正在尝试使用模型表单上传文件,但form.save()给了我错误的请求。 这是我的模特:

class cv(models.Model):
    name = models.CharField('Name', max_length=64, null=True)
    path_to_cv = models.FileField('CV', upload_to='/', null=True)

以下是表格:

class Step2(forms.ModelForm):
    class Meta:
    model = cv

以下是观点:

def phdStep2(request):
    if request.method == 'POST':
        form = PhdStep2(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/step/3/')
    else:
        form = PhdStep2()
    return render(request, 'step2.html', {'form': form})

以下是表单的模板:

<form action="/step/2" method="post" class="well form" role="form" enctype="multipart/form-data">
{% csrf_token %}
{% bootstrap_form form %}
{% buttons %}
    <button type="submit" class="btn btn-primary">
        Submit
    </button>
{% endbuttons %}
</form>

这是settings.py中的media_root:

MEDIA_ROOT = '/home/supertux/PyCharm/myproject/admissions/media'
MEDIA_URL = '/media/'

我已经阅读了10个这样的线程并且发现大多数时候问题是我已经合并的形式的enctype。现在据我所知,这应该上传文件,因为它的模型形式,但我总是得到400 Bad Request。我想在数据库中存储文件的名称和路径。我做错了什么?

3 个答案:

答案 0 :(得分:3)

尝试将upload_to='/'替换为upload_to='%Y/%m/%d',并确保运行django应用程序的用户具有MEDIA_ROOT的写入权限。如果这些建议都没有帮助您可以打开一些额外的日志记录,希望能够揭示问题所在。

更新: 我建议您将upload_to设置为某个内容,这样如果不是1000个文件堆积在同一目录中,则不会有100个。随着时间的推移,将很难管理。我没试过这个,但如果你把它设置为upload_to=''怎么办呢,它会接受吗?在Django 1.6中,他们使这个参数可选。

Update2:我对哪个版本的可选版本不正确。我正在阅读文档的开发版本。道歉。

答案 1 :(得分:1)

如果您不知道发生了什么事情,请尝试捕获例外

重点是:

  

django FileField尝试将。*的文件路径解释为 relative   路径,但/ *到一个   绝对路径

这将是位于django.core.files.storage模块中的SuspiciousFileOperation异常,这看起来很神奇,

def path(self, name):
try:
    path = safe_join(self.location, name)
except ValueError:
    raise SuspiciousFileOperation("Attempted access to '%s' denied." % name)
return os.path.normpath(path)

答案 2 :(得分:-2)

upload_to=""不起作用时,请尝试upload_to="."。路径“。”是默认路径MEDIA_ROOT(在Django 1.6.x中)