django文件上传不起作用
Posted
技术标签:
【中文标题】django文件上传不起作用【英文标题】:django file upload doesn't work 【发布时间】:2017-06-14 14:29:49 【问题描述】:我正在研究网络应用项目。我的文件上传有问题。 它适用于管理员,但对于普通用户文件不保存。一定是mu views.py或者template html
的问题forms.py
class DocumentUpload(forms.ModelForm):
class Meta:
model = Form
fields = ('file',)
models.py
class Form(TimeStampedModel, TitleSlugDescriptionModel):
author = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=512)
is_final = models.BooleanField(default=False)
is_public = models.BooleanField(default=False)
is_result_public = models.BooleanField(default=False)
file = models.FileField(null=True, blank=True)
def __str__(self):
return self.title
def get_absolute_url(self):
return reverse('form-detail', kwargs='slug': self.slug)
views.py
def create_form(request):
if request.method == 'POST':
user = request.user
data = ParseRequest(request.POST)
print(data.questions())
print(data.form())
parsed_form = data.form()
parsed_questions = data.questions()
# tworzy formularz o podanych parametrach
formfile = DocumentUpload(request.POST, request.FILES or None)
if formfile.is_valid():
form = formfile.save(commit=False)
print(form)
form.author = user
form.title = parsed_form['title']
form.is_final = parsed_form['is_final']
form.is_result_public = parsed_form['is_result_public']
form.description = parsed_form['description']
form.save()
# zapisuje pytania z ankiety wraz z odpowienimi pytaniami
for d in parsed_questions:
question = Question(form=form, question=d['question'])
question.save()
# dla kazdego pytania zapisz wszystkie opcje odpowiadania
for opt in d['options']:
option = Option(question=question, option=opt)
option.save()
return render(request, 'forms/form_form.html', )
else:
form = DocumentUpload()
return render(request, 'forms/form_form.html', 'form': form)
create_form.html
% block content %
<form method="post" id="form" enctype='multipart/form-data'>
%csrf_token %
<div class="form-group">
% csrf_token %
<label for="form-title">Tytuł formularza</label>
<input id="form-title" class="form-control" type="text"
placeholder="Tytuł" required/>
</div>
form.as_p
<input class="btn btn-default" type="submit" value="zapisz"/>
</form>
% endblock %
5.settings.py
....
DATABASES =
'default':
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
STATIC_URL = '/static/'
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
]
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
...
5.urls.py
if settings.DEBUG:
urlpatterns +=
static(settings.STATIC_URL,document_root=settings.STATIC_ROOT)
urlpatterns += static(settings.MEDIA_URL,
document_root=settings.MEDIA_ROOT)
【问题讨论】:
您能分享一下您是如何工作的解决方案吗?我仍然面临这个问题。 【参考方案1】:您忘记在您的form
上添加action
,就像这样:
<form action="% url 'name_of_your_function' %" method="post" id="form" enctype='multipart/form-data'>
...
</form>
action 必须包含您的 url 名称,例如:
url(url_regex, views.function, name="name_of_your_function"),
【讨论】:
我做了,但还是不行。我没有错误,表单只是保存而没有文件。 使用form.is_valid()
下的import pdb; pdb.set_trace()
检查表单是否通过,它将在您的控制台上显示为(pdb) ...
,如果它有效,然后尝试在控制台内部查看什么不起作用一步一步输入下面的代码。
我尝试使用这个调试器,但我没有发现任何错误
@JanekWojciechowski 如果我理解得很好,现在表单会为用户保存所有信息,除了文件,那么这应该是您的媒体配置的问题,您能否告诉我您的 urls.py 和设置。派?你在本地主机上吗?
是的,这是真的,所有信息都正确保存,除了文件。它就像没有文件(它不存在)一样工作。我编辑并添加了部分网址和设置。如果还不够,请告诉我。【参考方案2】:
您尚未在models.py
中为您的FileField
指定upload_to
属性。
为您的字段添加一个目录,例如,
file = models.FileField(upload_to='uploads/', null=True, blank=True)
您的表单一切正常,文件已通过请求发送,但 Django 不知道将文件保存在哪里,直到您在模型中定义它。
在docs here了解更多信息
【讨论】:
我添加了,所以现在在我的模型中:file = models.FileField(upload_to='media/', null=True, blank=True),我进行了迁移,但仍然不起作用。一切都适用于管理员,所以我认为它知道在哪里保存它。 还有其他想法吗?以上是关于django文件上传不起作用的主要内容,如果未能解决你的问题,请参考以下文章
仅在 django 中创建基于更新类的视图时,为我的文件上传使用表单集不起作用
Django 2.2静态文件在生产中不起作用(DEBUG False)[重复]
使用 django ajax jquery 提交一个文件不起作用的表单