我正在尝试使用模型表单上传文件,但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。我想在数据库中存储文件的名称和路径。我做错了什么?
答案 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中)