如何在Django中上载文件?[闭门]

关闭。这个问题需要更加关注。它目前不接受答案。

<hr class=“my12大纲无baw0 bb bc-POWER-400”/

想改进此问题吗?编辑此帖子,更新问题,使其只关注一个问题。

已于5年前关闭

改进这个问题

作为Django的新手,我在Django 1.3中制作上传应用程序时遇到了困难。我找不到任何最新的示例/代码片段。是否有人可以发布一个最小但完整的(模型、视图、模板)示例代码来这样做

呸,Django文档在这方面真的没有很好的例子。我花了2个多小时去挖掘所有的片段来理解它是如何工作的。有了这些知识,我实现了一个项目,可以上传文件并将其显示为列表。要下载项目的源代码,请访问https://github.com/axelpale/minimal-django-file-upload示例或克隆它:

git克隆https://github.com/axelpale/minimal-django-file-upload-example.git

更新2013-01-30:GitHub上的源代码除了1.3之外,还实现了Django 1.4。尽管改动很少,但下面的教程对1.4也很有用

更新2013-05-10:在GitHub上实施Django 1.5。在url.py中重定向和在list.html中使用url模板标记方面有细微变化。感谢hubert3的努力

更新2013-12-07:GitHub支持Django 1.6。myapp/URL.py中的一个导入更改。感谢Arthedian

更新2015-03-17:GitHub支持Django 1.7,这要感谢aronysidoro

更新2015-09-04:得益于nerogit,GitHub支持Django 1.8

更新2016-07-03:得益于daavve和nerogit,GitHub支持Django 1.9

项目树

一个基本的Django 1.3项目,带有单个应用程序和用于上传的媒体/目录

最小django文件上载示例/
src/
我的项目/
数据库/
sqlite.db
媒体/
myapp/
模板/
myapp/
list.html
forms.py
models.py
url.py
views.py
__初始值
manage.py
设置.py
url.py

1.设置:myproject/Settings.py

若要上载和提供文件,您需要指定Django存储上载文件的位置以及Django提供上载文件的URL。默认情况下,MEDIA_ROOT和MEDIA_URL位于settings.py中,但它们为空。有关详细信息,请参阅Django管理文件中的第一行。还请记住设置数据库并将myapp添加到已安装的应用中

。。。
导入操作系统
BASE_DIR=os.path.dirname(os.path.dirname(_文件__))
...
数据库={
“默认值”:{
“引擎”:“django.db.backends.sqlite3”,
'NAME':os.path.join(BASE_DIR,'database.sqlite3'),
“用户”:“,
“密码”:“,
“主持人”:“,
“端口”:“,
}
}
...
MEDIA\u ROOT=os.path.join(基本目录'MEDIA')
媒体URL='/MEDIA/'
...
已安装的应用程序=(
...
“myapp”,
)

2.模型:myproject/myapp/models.py

接下来,您需要一个带有文件字段的模型。此特定字段根据当前日期和媒体根存储文件,例如到媒体/documents/2011/12/24/的文件。请参阅文件字段参考

#-*-编码:utf-8-*-
从django.db导入模型
类文档(models.Model):
docfile=models.FileField(上传到class='documents/%Y/%m/%d')

3.表格:myproject/myapp/forms.py

要很好地处理上载,您需要一个表单。此表单只有一个字段,但这已经足够了。有关详细信息,请参阅表单文件字段参考

#-*-编码:utf-8-*-
来自django导入表单
类文档表单(forms.Form):
docfile=forms.FileField(
label='Select a file',
帮助\u text='max.42兆字节'
)

4.视图:myproject/myapp/views.py

这是一个所有魔法发生的视图。请注意request.FILES是如何处理的。对我来说,很难发现request.FILES['docfile']可以像这样保存到models.FileField。模型的save()自动处理文件到文件系统的存储

#-*-编码:utf-8-*-
从django.shortcuts导入渲染到响应
从django.template导入请求上下文
从django.http导入HttpResponseRedirect
从django.core.urlResolver反向导入
从myproject.myapp.models导入文档
从myproject.myapp.forms导入文档表单
def列表(请求):
#处理文件上传
如果request.method==“POST”:
表单=文档表单(request.POST、request.FILES)
如果form.is_有效():
newdoc=Document(docfile=request.FILES['docfile'])
newdoc.save()
#POST后重定向到文档列表
返回HttpResponseRedirect(反向('myapp.views.list'))
其他:
form=DocumentForm()#一个空的、未绑定的表单
#加载列表页面的文档
documents=Document.objects.all()
#使用文档和表单呈现列表页面
返回render\u to\u响应(
“myapp/list.html”,
{'documents':文档,'form':form},
context\u instance=RequestContext(请求)
)

5.项目URL:myproject/url.py

Django默认不提供MEDIA_ROOT服务。这在生产环境中是危险的。但在开发阶段,我们可以缩短。请注意最后一行。该行允许Django从MEDIA_URL提供文件。这仅在开发阶段有效

有关详细信息,请参阅django.conf.urls.static.static参考。另请参阅关于服务媒体文件的讨论

#-*-编码:utf-8-*-
从django.conf.url导入模式,包括,url
从django.conf导入设置
从django.conf.url.static导入静态
urlpatterns=模式(“”,
(r'^',包括('myapp.url'),
)+静态(settings.MEDIA\u URL,document\u root=settings.MEDIA\u root)

6.应用程序URL:myproject/myapp/URL.py

若要使视图可访问,必须为其指定URL。此处没有特别之处

#-*-编码:utf-8-*-
从django.conf.url导入模式,url
urlpatterns=patterns('myapp.views',
url(r“^list/$”,“list”,name='list'),
)

7.模板:myproject/myapp/templates/myapp/list.html

最后一部分:列表模板及其下方的上载表单。表单必须将enctype属性设置为“multipart/form data”,方法设置为“post”,才能上载到Django。有关详细信息,请参阅文件上载文档

FileField有许多属性可以在模板中使用。例如{document.docfile.url}}和{{document.docfile.name}}与模板中的属性相同。有关这些属性的更多信息,请参阅“在模型中使用文件”一文和“文件对象”文档

&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;头部&gt;
&lt;meta charset=“utf-8”&gt;
&lt;title&gt;最小Django文件上载示例&lt;/title&gt;
&lt;/head&gt;
&lt;车身&gt;
&lt;!--上载文档的列表--&gt;
{%if文档%}
&lt;ul&gt;
{文档%中的文档为%}
&lt;li&gt;&lt;a href=”https://stackoverflow.com/questions/5871730/{{document.docfile.url}}“{{document.docfile.name}&lt;/a&gt;&lt;/li&gt;
{%endfor%}
&lt;/ul&gt;
{%else%}
&lt;p&gt;无文件。lt;/p&gt;
{%endif%}
&lt;!--上载表单。注意enctype属性!--&gt;
&lt;form action=“{%url”列表“%}”method=“post”enctype=“多部分/表单数据”&gt;
{%csrf_令牌%}
&lt;p&gt;{{form.non_field_errors}}&lt;/p&gt;
&lt;p&gt;{{form.docfile.label_tag}{{form.docfile.help_text}}&lt;/p&gt;
&lt;p&gt;
{{form.docfile.errors}
{{form.docfile}
&lt;/p&gt;
&lt;p&gt;lt;输入类型=“提交”值=“上传”/&gt;lt;/p&gt;
&lt;/form&gt;
&lt;/body&gt;
&lt;/html&gt;

8.初始化

只需运行syncdb和runserver

cd myproject
&gt;python manage.py syncdb
&gt;python manage.py运行服务器

结果

最后,一切都准备好了。在默认的Django开发环境中,上传的文档列表可以在localhost:8000/list/上看到。今天,这些文件被上传到/path/to/myproject/media/documents/2011/12/17/an

发表评论