<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}}与模板中的属性相同。有关这些属性的更多信息,请参阅“在模型中使用文件”一文和“文件对象”文档
<;!DOCTYPE html>;
<;html>;
<;头部>;
<;meta charset=“utf-8”>;
<;title>;最小Django文件上载示例<;/title>;
<;/head>;
<;车身>;
<;!--上载文档的列表-->;
{%if文档%}
<;ul>;
{文档%中的文档为%}
<;li>;<;a href=”https://stackoverflow.com/questions/5871730/{{document.docfile.url}}“{{document.docfile.name}<;/a>;<;/li>;
{%endfor%}
<;/ul>;
{%else%}
<;p>;无文件。lt;/p>;
{%endif%}
<;!--上载表单。注意enctype属性!-->;
<;form action=“{%url”列表“%}”method=“post”enctype=“多部分/表单数据”>;
{%csrf_令牌%}
<;p>;{{form.non_field_errors}}<;/p>;
<;p>;{{form.docfile.label_tag}{{form.docfile.help_text}}<;/p>;
<;p>;
{{form.docfile.errors}
{{form.docfile}
<;/p>;
<;p>;lt;输入类型=“提交”值=“上传”/>;lt;/p>;
<;/form>;
<;/body>;
<;/html>;
8.初始化
只需运行syncdb和runserver
cd myproject
>;python manage.py syncdb
>;python manage.py运行服务器
结果
最后,一切都准备好了。在默认的Django开发环境中,上传的文档列表可以在localhost:8000/list/上看到。今天,这些文件被上传到/path/to/myproject/media/documents/2011/12/17/an