# -*- coding: utf-8 -*-
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from myproject.myapp.models import Document
from myproject.myapp.forms import DocumentForm
def list(request):
# Handle file upload
if request.method == 'POST':
form = DocumentForm(request.POST, request.FILES)
if form.is_valid():
newdoc = Document(docfile = request.FILES['docfile'])
newdoc.save()
# Redirect to the document list after POST
return HttpResponseRedirect(reverse('myapp.views.list'))
else:
form = DocumentForm() # A empty, unbound form
# Load documents for the list page
documents = Document.objects.all()
# Render list page with the documents and the form
return render_to_response(
'myapp/list.html',
{'documents': documents, 'form': form},
context_instance=RequestContext(request)
)
...<other imports>...
from django.conf import settings
from django.conf.urls.static import static
from uploader import views as uploader_views
urlpatterns = [
...<other url patterns>...
path('', uploader_views.home, name='imageupload'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
5个。更新models.py
更新uploader/models.py:
from django.db import models
from django.forms import ModelForm
class Upload(models.Model):
pic = models.FileField(upload_to="images/")
upload_date=models.DateTimeField(auto_now_add =True)
# FileUpload form class.
class UploadForm(ModelForm):
class Meta:
model = Upload
fields = ('pic',)
6。更新views.py
更新uploader/views.py:
from django.shortcuts import render
from uploader.models import UploadForm,Upload
from django.http import HttpResponseRedirect
from django.urls import reverse
# Create your views here.
def home(request):
if request.method=="POST":
img = UploadForm(request.POST, request.FILES)
if img.is_valid():
img.save()
return HttpResponseRedirect(reverse('imageupload'))
else:
img=UploadForm()
images=Upload.objects.all().order_by('-upload_date')
return render(request,'home.html',{'form':img,'images':images})
当然,Django文档并没有很好的例子。我花了两个多小时去挖掘所有的碎片来理解这是怎么回事。有了这些知识,我实现了一个项目,可以上传文件并将其显示为列表。要下载项目的源代码,请访问https://github.com/axelpale/minimal-django-file-upload-example或克隆它:
更新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:GitHub支持Django 1.9,这要感谢daavve和nerogit
项目树
一个基本的Django 1.3项目,只有一个应用程序和一个上传的媒体/目录。
一。设置:myproject/Settings.py
要上载和提供文件,您需要指定Django存储上载文件的位置以及Django提供文件的URL。默认情况下,MEDIA_ROOT和MEDIA_URL位于settings.py中,但它们为空。有关详细信息,请参见Django Managing Files中的第一行。还记得设置数据库并将myapp添加到已安装的应用程序中
2。型号:myproject/myapp/models.py
接下来需要一个带有FileField的模型。此特定字段根据当前日期和媒体根目录将文件存储到media/documents/2011/12/24/。见FileField reference。
三。表单:myproject/myapp/forms.py
要很好地处理上传,您需要一个表单。这个表单只有一个字段,但这就足够了。详见Form FileField reference。
四。视图:myproject/myapp/views.py
所有魔法发生的地方。注意
request.FILES
是如何处理的。对我来说,很难发现request.FILES['docfile']
可以像这样保存到models.FileField。模型的save()自动处理文件到文件系统的存储。5个。项目URL:myproject/URLs.py
默认情况下,Django不提供媒体根目录。这在生产环境中是危险的。但在发展阶段,我们可以缩短。注意最后一行。这一行使Django能够提供来自媒体URL的文件。这只在开发阶段有效。
有关详细信息,请参见django.conf.urls.static.static reference。另请参见this discussion about serving media files。
6。应用程序URL:myproject/myapp/URLs.py
要使视图可访问,必须为其指定URL。这里没什么特别的。
7号。模板:myproject/myapp/templates/myapp/list.html
最后一部分:列表模板和下面的上传表单。表单必须将enctype属性设置为“multipart/form data”,将方法设置为“post”,才能上载到Django。有关详细信息,请参见File Uploads documentation。
FileField有许多可以在模板中使用的属性。E、 模板中的g.{{document.docfile.url}和{{document.docfile.name}。请参阅Using files in models article和The File object documentation中有关这些的更多信息。
8个。初始化
只需运行syncdb和runserver。
结果
最后,一切都准备好了。在默认的Django开发环境中,上传的文档列表可以在
localhost:8000/list/
中看到。今天,这些文件被上传到/path/to/myproject/media/documents/2011/12/17/并可以从列表中打开。我希望这个答案能像帮助我一样帮助别人。
一般来说,当你试图“只是得到一个有效的例子”时,最好“只是开始写代码”。这里没有代码可以帮助你,所以回答这个问题对我们来说要困难得多。
如果你想抓取一个文件,你需要在一个html文件中的某个地方像这样:
这将为您提供browse按钮、upload按钮来启动操作(提交表单)并注意enctype,以便Django知道要给您
request.FILES
在某个视图中,您可以使用
在file upload docs中有大量的信息
我建议您仔细阅读该页,然后开始编写代码,然后在它不起作用时返回示例和堆栈跟踪。
Demo
更新Akseli Palén's answer。请参阅github repo,使用Django 2
最小Django文件上载示例
一。创建django项目
运行startproject::
现在创建了一个文件夹(sample):
2。创建应用程序
创建应用程序:
现在创建一个包含这些文件的文件夹(
uploader
):三。更新设置.py
在
sample/settings.py
上,将'uploader.apps.UploaderConfig'
添加到INSTALLED_APPS
,并添加MEDIA_ROOT
和MEDIA_URL
,即:四。更新url.py
在
sample/urls.py
中添加:5个。更新models.py
更新
uploader/models.py
:6。更新views.py
更新
uploader/views.py
:7号。创建模板
在文件夹上载程序中创建文件夹模板,然后创建文件home.html:
8个。同步数据库
同步数据库和运行服务器:
访问http://localhost.com:8000
相关问题 更多 >
编程相关推荐